-------------------------純手打總結(jié),轉(zhuǎn)載請(qǐng)注明出處,愛您~
列表、字典、集合是可變序列;元組和字符串是不可變序列。

* python提供的序列類型在所有程序設(shè)計(jì)語言中是最豐富,最靈活。也是功能最強(qiáng)大的。
* python中常用的序列結(jié)構(gòu)有列表、元組、字典、字符串、集合以及range等等。
* 除字典和集合之外,列表、元組、字符串等序列均支持雙向索引,第一個(gè)元素下標(biāo)為0,第二個(gè)元素下標(biāo)為1,以此類推;最后一個(gè)元素下標(biāo)為-1,倒數(shù)第二個(gè)元素下標(biāo)為-2,以此類推。

3.1列表
* 列表是python中內(nèi)置可變序列,是一個(gè)元素的有序集合,定界符為"[]",元素逗號(hào)分隔開。
* 當(dāng)列表元素增加或刪除時(shí),列表對(duì)象自動(dòng)進(jìn)行擴(kuò)展或收縮內(nèi)存,保證元素之間沒有縫隙。
* 在python中,一個(gè)列表中的數(shù)據(jù)類型可以各不相同,可以同時(shí)分別為整數(shù)、實(shí)數(shù)、字符串等基本類型,甚至是列表、元素、字典、集合以及其他自定義類型的對(duì)象。例如:[10,20,30,40]
['spam',2.0,5,[10,20]]
[['file1',200,7],['file2',260,9]]
* 列表方法

append和extend的區(qū)別:

3.1.1列表創(chuàng)建與刪除
* 使用“=”直接將一個(gè)列表賦值給變量即可創(chuàng)建列表對(duì)象,例如:
>>> a_list=['a','b','mpilgrim','z','example']
>>> print(a_list)
['a', 'b', 'mpilgrim', 'z', 'example']
>>> a_list=[]
>>> print(a_list)
[]
>>>? ? ?#? 上面的a_list=[]? 是創(chuàng)建了一個(gè)空列表
* 或者,使用list()函數(shù)將元組、range對(duì)象、字符串或其他類型的可迭代對(duì)象類型的數(shù)據(jù)轉(zhuǎn)換為列表。例如:
>>> a_list=list((3,5,7,9,11))
>>> print(a_list)
[3, 5, 7, 9, 11]? ? ? ? ? #將元組轉(zhuǎn)換為列表
>>> list(range(1,10,2))
[1, 3, 5, 7, 9]? ? ? ? ??#將range對(duì)象轉(zhuǎn)換為列表
>>> list('hello world')
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']? ? ?#將字符串轉(zhuǎn)換為列表
>>> x=list()? #創(chuàng)建空列表
>>> print(x)
[]
* range()接收三個(gè)參數(shù),第一個(gè)參數(shù)表示起始值(默認(rèn)為0),第二個(gè)參數(shù)表示終止值(結(jié)果中不包括這個(gè)值),第三個(gè)參數(shù)表示步長(zhǎng)(默認(rèn)為1).
* 當(dāng)不再使用列表時(shí),使用del命令刪除整個(gè)列表,如果列表對(duì)象所指向的值不再有其他對(duì)象指向,python將同時(shí)刪除該值。
>>> del a
>>> a
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
a
NameError: name 'a' is not defined
* 正如上面的代碼所展示的一樣,刪除列表對(duì)象a之后,該對(duì)象就不存在了,再次訪問時(shí)將拋出異常"NameError"提示訪問的對(duì)象名不存在。
3.1.2列表元素的增加
(1)可以使用"+"運(yùn)算符來實(shí)現(xiàn)將元素添加到列表中的功能。這并不是真的為列表添加元素,而是創(chuàng)建一個(gè)新列表,并將原列表中的元素和新元素依次復(fù)制到新列表的內(nèi)存空間。由于涉及大量元素的復(fù)制,該操作速度較慢。
>>> aList=[3,4,5]
>>> aList=aList+[7]
>>> print(aList)
[3, 4, 5, 7]
(2)使用列表對(duì)象的append()方法,原地修改列表,是真正意義上的在列表尾部添加元素,速度較快,也是推薦使用的方法。
>>> aList.append(9)
>>> print(aList)
[3, 4, 5, 7, 9]
為了比較"+"和append()這兩種方法的速度差異,請(qǐng)看以下代碼:?

(3)使用列表對(duì)象的extend()方法可以將另一個(gè)迭代對(duì)象的所有元素添加至該列表對(duì)象尾部。extend()方法屬于原地操作,不改變其內(nèi)存首地址。
>>> a=[1,2,4]? ? ? ? ? ? ? #創(chuàng)建一個(gè)名字為a的列表
>>> id(a)
1903874579400
>>> a.extend([7,8,9])?????#把新的列表里面的所有元素添加到名字為a的列表尾部,a的地址不變
>>> id(a)
1903874579400
>>> a.extend((15,17))? ? ?#把新的元組里面的所有元素添加到名字為a的列表尾部?,a的地址不變
>>> id(a)
1903874579400
>>> print(a)
[1, 2, 4, 7, 8, 9, 15, 17]
(4)使用列表對(duì)象的insert()方法將元素添加至列表的指定位置,原地操作,不改變其內(nèi)存首地址。
>>> print(a)
[1, 2, 4, 7, 8, 9, 15, 17]
>>> a.insert(3,6)
>>> print(a)
[1, 2, 4, 6, 7, 8, 9, 15, 17]
* 列表的insert()方法會(huì)涉及到插入位置之后所有元素的移動(dòng),還會(huì)影響處理速度,類似的還有后面的remove()方法以及使用pop()函數(shù)彈出列表非尾部元素和使用del刪除列表非尾部元素的情況。
(5)使用乘法來擴(kuò)展列表對(duì)象。
>>> aList=[3,5,7]
>>> aList=aList*3
>>> print(aList)
[3, 5, 7, 3, 5, 7, 3, 5, 7]
>>> aList*=2? ? ? #相當(dāng)于?aList=aList*2
>>> print(aList)
[3, 5, 7, 3, 5, 7, 3, 5, 7, 3, 5, 7, 3, 5, 7, 3, 5, 7]
3.1.3 列表元素的刪除
(1)使用del命令刪除列表中的指定位置上的元素或整個(gè)列表。
>>> a_list=[3,5,7,9,11]
>>> del a_list[1]
>>> print(a_list)
[3, 7, 9, 11]
>>> del a_list
>>> print(a_list)
Traceback (most recent call last):
? File "<pyshell#4>", line 1, in <module>
? ? print(a_list)
NameError: name 'a_list' is not defined
(2)使用列表的pop()方法刪除并返回指定(默認(rèn)為最后一個(gè))位置上的元素,如果給定的索引超出了列表的范圍則拋出異常。
>>> a_list=list((3,5,7,9,11))
>>> a_list.pop()? ? ? ? #pop方法默認(rèn)刪除最后一個(gè)元素并返回刪除的最后一個(gè)元素的值
11
>>> print(a_list)
[3, 5, 7, 9]
>>> a_list.pop(1)? ?
5? ? ??#pop方法刪除第二個(gè)元素并返回刪除的第二個(gè)元素的值
>>> print(a_list)
[3, 7, 9]
(3)使用列表對(duì)象的remove()方法刪除首次出現(xiàn)的指定元素,如果列表中不存在要?jiǎng)h除的元素,則拋出異常。
>>> a_list=[3,5,7,9,7,11]? ? ? ? ?#創(chuàng)建名稱為a_list的列表
>>> a_list.remove(7)? ? ? #刪除列表中第一次出現(xiàn)的元素:7
>>> print(a_list)
[3, 5, 9, 7, 11]
>>> a_list.clear(3)? ? #clear只能清空列表中的全部元素,不能清除指定元素
Traceback (most recent call last):
? File "<pyshell#14>", line 1, in <module>
? ? a_list.clear(3)
TypeError: clear() takes no arguments (1 given)
>>> a_list.clear()??
>>> print(a_list)? ??
[]? ???#使用clear方法清空列表中的內(nèi)容,列表對(duì)象并沒有被刪除
3.1.4 列表元素訪問與計(jì)數(shù)
(1)使用下標(biāo)直接訪問列表元素
>>> aList=[3,4,5,5.5,7,9,11,13,15,17]
>>> print(aList[3])? ? #輸出下標(biāo)為3的元素的值
5.5
* 如果指定下標(biāo)不存在,則拋出異常
>>> print(aList[15])
Traceback (most recent call last):
? File "<pyshell#27>", line 1, in <module>
? ? print(aList[15])
IndexError: list index out of range
(2) 使用列表對(duì)象的index方法獲取指定元素首次出現(xiàn)的下標(biāo)
>>> aList=[3,4,5,5.5,7,9,11,13,15,17]
>>> print(aList.index(7))? ?
4? ? ? ? ? #使用列表對(duì)象的index方法得出元素7的索引
* 若列表對(duì)象中不存在指定元素,則拋出異常
>>> print(aList.index(100))
Traceback (most recent call last):
? File "<pyshell#30>", line 1, in <module>
? ? print(aList.index(100))
ValueError: 100 is not in list
(3) 使用列表對(duì)象的count方法統(tǒng)計(jì)指定元素在列表對(duì)象中出現(xiàn)的次數(shù)
>>> aList=[3,4,5,5.5,7,9,11,13,15,17]
>>> print(aList.count(7))
1? ? ? ? ? ? ? ? ?#計(jì)算數(shù)字7在列表中出現(xiàn)的次數(shù)
>>> print(aList.count(0))
0?????????????????#計(jì)算數(shù)字0在列表中出現(xiàn)的次數(shù)
>>> print(aList.count(8))
0??????????????????#計(jì)算數(shù)字0在列表中出現(xiàn)的次數(shù)
3.1.5 列表元素排序
* 列表對(duì)象的sort()方法用于按照指定的規(guī)則對(duì)所有元素進(jìn)行排序;
* reverse()方法用于將列表所有元素逆序或翻轉(zhuǎn)。
>>> x=list(range(11))???????????? #包含11個(gè)整數(shù)的列表
>>> import random
>>> random.shuffle(x)? ? ? ??
>>> print(x)???? #用random模塊的shuffle方法把列表x中的元素隨機(jī)亂序
[5, 1, 10, 9, 4, 6, 8, 3, 0, 7, 2]
>>> x.sort()?????????#用列表對(duì)象的sort方法按照默認(rèn)規(guī)則排序
>>> print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> x.sort(key=lambda item:len(str(item)),reverse=True)? ? #按轉(zhuǎn)換成字符串以后的長(zhǎng)度,降序排列
>>> print(x)? ? ? ? ? ? ? ? ? ? ??不理解。?ppt里面的答案是[10, 6, 0, 1, 7, 4, 3, 2, 8, 5, 9]
[10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x.reverse()? ? ? #把所有元素翻轉(zhuǎn)或逆序? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? >>> print(x)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 10]
3.1.6 切片操作? 重點(diǎn)看!
* 切片是Python序列的重要操作之一,適用于列表、元組、字符串、range對(duì)象等類型。
* 切片使用2個(gè)冒號(hào)分隔的3個(gè)數(shù)字來完成,第一個(gè)數(shù)字表示切片開始位置(默認(rèn)為0),第二個(gè)數(shù)字表示切片截止(但不包含)位置(默認(rèn)為列表長(zhǎng)度),第三個(gè)數(shù)字表示切片的步長(zhǎng)(默認(rèn)為1),當(dāng)步長(zhǎng)省略時(shí)可以順便省略最后一個(gè)冒號(hào)。
* 可以使用切片來截取列表中的任何部分,得到一個(gè)新列表,也可以通過切片來修改和刪除列表中部分元素,甚至可以通過切片操作為列表對(duì)象增加元素。
* 與使用下標(biāo)訪問列表元素的方法不同,切片操作不會(huì)因?yàn)橄聵?biāo)越界而拋出異常,而是簡(jiǎn)單地在列表尾部截?cái)嗷蛘叻祷匾粋€(gè)空列表,代碼具有更強(qiáng)的健壯性。
(1)可以使用切片訪問列表內(nèi)容:
>>>?aList=[3,4,5,6,7,9,11,13,15,17]
>>> aList[::]? ? ?#開始位置為0,結(jié)束位置為10,切片的步長(zhǎng)為1,即按照
[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]????????順序排序。
>>> aList[::-1]?????#開始位置為0,結(jié)束位置為10,切片的步長(zhǎng)為-1,即
[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]? ? ? ? 倒敘排序。
>>> aList[::2]?????#開始位置為0,結(jié)束位置為10,切片的步長(zhǎng)為2,即
[3, 5, 7, 11, 15]????每?jī)蓚€(gè)元素之間相差2。
>>> aList[1::2]?????#開始位置為1,結(jié)束位置為10,切片的步長(zhǎng)為2,即
[4, 6, 9, 13, 17]????????????每?jī)蓚€(gè)元素之間相差2。
>>> aList[3::]?????#開始位置為3,結(jié)束位置為10,切片的步長(zhǎng)為1,即按
[6, 7, 9, 11, 13, 15, 17]????????照順序從位置3開始排序。
>>> aList[3:6]?????#開始位置為3,結(jié)束位置為6,切片的步長(zhǎng)為1,即按
[6, 7, 9]????????照順序從位置3開始排序。
>>> aList[3:6:1]?????#開始位置為3,結(jié)束位置為6,切片的步長(zhǎng)為1,即
[6, 7, 9]????????????按照順序從位置3開始排序。
>>> aList[0:100:1]?????#開始位置為0,結(jié)束位置為100,切片的步長(zhǎng)為1,
[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]? ? ? 即按照順序排序,越界也不拋出異常。
>>> aList[100:]?????#開始位置為100,沒有元素,越界不拋出異常
[]? ? ??
(2)可以使用切片來原地修改列表內(nèi)容:(不理解?。。?/p>
>>> aList=[3,5,7]
>>> aList[len(aList):]? #把列表的長(zhǎng)度作為開始位置進(jìn)行訪問,訪問到空列表
[]
>>> aList[len(aList):]=[9]? ? ?#在列表長(zhǎng)度的位置添加元素9,相當(dāng)于把原來的空元素修改為9
>>> print(aList)
[3, 5, 7, 9]
>>> aList[:3]=[1,2,3]
>>> aList
[1, 2, 3, 9]
>>> aList[:3]=[]
>>> print(aList)
[9]
(3)使用del與切片結(jié)合來刪除列表元素:
>>> aList=[3,5,7,9,11]
>>> del aList[:3]
>>> print(aList)
[9, 11]
3.1.7 列表排序
(1)使用內(nèi)置函數(shù)sorted對(duì)列表進(jìn)行排序并返回新列表:
>>> aList=[9,7,6,5,4,3,17,15,13,11]
>>> sorted(aList)? ? ? #正序排列
[3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>> sorted(aList,reverse=True)? ? #逆序排列
[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
>>> print(aList) ????????#使用sorted函數(shù)排序返回的是新列表,原有列表順? ?[9, 7, 6, 5, 4, 3, 17, 15, 13, 11]? ??序不變。?? ? ? ? ?
* 列表對(duì)象的sort方法進(jìn)行原地排序,即直接改變列表的順序。
(2)使用列表對(duì)象的reverse方法將元素原地逆序:
>>> aList=[3,4,5,6,7,9,11,13,15,17]
>>> aList.reverse()
>>> print(aList)
[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
(3)使用內(nèi)置函數(shù)reversed方法對(duì)列表元素進(jìn)行逆序排列并返回迭代對(duì)象:
>>> aList=[3,4,5,6,7,9,11,13,15,17]
>>> newList=reversed(aList)
>>> print(newList)
<list_reverseiterator object at 0x0000020E9BAA3748>
>>> list(newList)
[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
>>> for i in newList:
print(i)
#無輸出內(nèi)容,迭代對(duì)象已遍歷結(jié)束,需要重新創(chuàng)建迭代對(duì)象
>>> newList=reversed(aList)? ?
>>> for i in newList:
print(i)
17
15
13
11
9
7
6
5
4
3? ??#列表對(duì)象的reverse方法將元素原地逆序。
3.1.8序列的常用內(nèi)置函數(shù)
* len(列表):返回列表中的元素個(gè)數(shù),同樣適用于元組、字典、字符串等等。
* max(列表)、min(列表):返回列表中的最大或最小元素,同樣適用于元組、range。
* sum(列表):對(duì)數(shù)值型列表的元素進(jìn)行求和運(yùn)算。對(duì)非數(shù)值型列表運(yùn)算則出錯(cuò),同樣適用于元組、range。
* zip(列表1,列表2,...):將多個(gè)列表對(duì)應(yīng)位置元素組合為元組,并返回包含這些元組的列表。
>>> aList=[1,2,3]
>>> bList=[4,5,6]
>>> cList=[7,8,9]
>>> dList=zip(aList,bList,cList)
>>> print(dList)
<zip object at 0x0000020E9BB59EC8>
>>> list(dList)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
* enumerate()函數(shù)枚舉列表元素,返回枚舉對(duì)象,其每個(gè)元素為包含下標(biāo)和值的元組。該函數(shù)對(duì)元組、字符串同樣有效。
>>> dList=[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> for item in enumerate(dList):
print(item)
(0, (1, 4, 7))
(1, (2, 5, 8))
(2, (3, 6, 9))
3.1.9列表推導(dǎo)式
* 列表推導(dǎo)式,也稱列表解析式。
* 使用非常簡(jiǎn)潔的方式對(duì)列表或其他可迭代對(duì)象的元素進(jìn)行遍歷,過濾與再次計(jì)算,快速生成滿足特定需求的新列表,代碼簡(jiǎn)潔具有很強(qiáng)的可讀性。例如:
>>> aList=[x*x for x in range(10)]
相當(dāng)于
>>> aList=[]
>>> for x in range(10):
aList.append(x*x)
>>> x=3
>>> print(x)
3
>>> print(aList)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
* 使用列表推導(dǎo)式實(shí)現(xiàn)嵌套列表的平鋪:
>>> vec=[[1,2,3],[4,5,6],[7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
* 過濾不符合條件的元素:
>>> aList=[-1,-4,6,7.5,-3.3,9,-11]
>>> [i for i in aList if i>0]
[6, 7.5, 9]
* 列出當(dāng)前文件夾下所有Python源文件:
>>> [filename for filename in os.listdir('.')if filename.endswith('.py')]
-------------------------純手打總結(jié),轉(zhuǎn)載請(qǐng)注明出處,愛您~