第三章 序列(1)

-------------------------純手打總結(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ū)別:

l

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)看以下代碼:?

可以看出,append()方法比使用"+"運(yùn)算快約70倍,相差兩個(gè)數(shù)量級(jí)。

(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)注明出處,愛您~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容