1.python序列概述

2.列表
列表(list)是最重要的Python內(nèi)置對象之一,是包含若干元素的有序連續(xù)內(nèi)存空間。
在形式上,列表的所有元素放在一對方括號[]中,相鄰元素之間使用逗號分隔。
在Python中,同一個列表中元素的數(shù)據(jù)類型可以各不相同,可以同時包含整數(shù)、實數(shù)、字符串等基本類型的元素,也可以包含列表、元組、字典、集合、函數(shù)以及其他任意對象。
如果只有一對方括號而沒有任何元素則表示空列表。
[10,
20, 30, 40]
['crunchy
frog', 'ram bladder', 'lark vomit']
['spam',
2.0, 5, [10, 20]]
[['file1',
200,7], ['file2', 260,9]]
[{3},
{5:6}, (1, 2, 3)]
使用“=”直接將一個列表賦值給變量即可創(chuàng)建列表對象。
>>>
a_list = ['a', 'b', 'mpilgrim', 'z', 'example']
>>>a_list = []?????????????????????? #創(chuàng)建空列表
也可以使用list()函數(shù)把元組、range對象、字符串、字典、集合或其他可迭代對象轉(zhuǎn)換為列表。
>>> list((3,5,7,9,11))??????????????? #將元組轉(zhuǎn)換為列表
[3, 5, 7, 9, 11]
>>> list(range(1, 10, 2))???????????? #將range對象轉(zhuǎn)換為列表
[1, 3, 5, 7, 9]
>>> list('hello world')?????????????? #將字符串轉(zhuǎn)換為列表
['h', 'e', 'l', 'l', 'o', ' ',
'w', 'o', 'r', 'l', 'd']
>>> list({3,7,5})???????????????????? #將集合轉(zhuǎn)換為列表
[3, 5, 7]
>>> list({'a':3, 'b':9,'c':78})????? #將字典的“鍵”轉(zhuǎn)換為列表
['a', 'c', 'b']
>>> list({'a':3, 'b':9,
'c':78}.items())#將字典的“鍵:值”對轉(zhuǎn)換為列表
[('b', 9), ('c', 78), ('a', 3)]
>>>x = list()?????????????????????????#創(chuàng)建空列表
創(chuàng)建列表之后,可以使用整數(shù)作為下標(biāo)來訪問其中的元素,其中0表示第1個元素,1表示第2個元素,2表示第3個元素,以此類推;列表還支持使用負(fù)整數(shù)作為下標(biāo),其中-1表示最后1個元素,-2表示倒數(shù)第2個元素,-3表示倒數(shù)第3個元素,以此類推。當(dāng)一個列表不再使用時,可以使用del命令將其刪除。


>>> x = list('Python')???????????? #創(chuàng)建類別對象
>>> x
['P', 'y', 't', 'h', 'o', 'n']
>>> x[0]?????????????????????????? #下標(biāo)為0的元素,第一個元素
'P'
>>> x[-1]????????????????????????? #下標(biāo)為-1的元素,最后一個元素
'n'_bottomo
>>>
x = [1, 2, 3]
>>>del x????????????????????? #刪除列表對象
>>>x?????????????????????????#對象刪除后無法再訪問,拋出異常
NameError:
name 'x' is not defined

列表常用的方法:

(1)append()、insert()、extend()
üappend()用于向列表尾部追加一個元素,insert()用于向列表任意指定位置插入一個元素,extend()用于將另一個列表中的所有元素追加至當(dāng)前列表的尾部。
>>> x = [1, 2, 3]
>>> x.append(4)???????????????????? #在尾部追加元素
>>> x.insert(0, 0)????????????????? #在指定位置插入元素
>>> x.extend([5, 6, 7])???????????? #在尾部追加多個元素
>>> x
[0, 1, 2, 3, 4, 5, 6, 7]
(2)pop()、remove()
üpop()用于刪除并返回指定位置(默認(rèn)是最后一個)上的元素;remove()用于刪除列表中第一個值與指定值相等的元素。
ü另外,還可以使用del命令刪除列表中指定位置的元素。
>>> x = [1, 2, 3, 4, 5, 6, 7]
>>> x.pop()??????????????????????? #彈出并返回尾部元素
7
>>> x.pop(0)?????????????????????? #彈出并返回指定位置的元素
1
>>> x = [1, 2, 1, 1, 2]
>>> x.remove(2)??????????????????? #刪除首個值為2的元素
>>> del x[3]?????????????????????? #刪除指定位置上的元素
>>> x
[1, 1, 1]
(3)count()、index()
ü列表方法count()用于返回列表中指定元素出現(xiàn)的次數(shù);index()用于返回指定元素在列表中首次出現(xiàn)的位置,如果該元素不在列表中則拋出異常。
>>> x = [1, 2, 2, 3, 3, 3, 4, 4,
4, 4]
>>> x.count(3)???????????????????? #元素3在列表x中的出現(xiàn)次數(shù)
3
>>> x.count(5)???????????????????? #不存在,返回0
0
>>> x.index(2)???????????????????? #元素2在列表x中首次出現(xiàn)的索引
1
>>> x.index(5)???????????????????? #列表x中沒有5,拋出異常
ValueError: 5 is not in list
(4)sort()、reverse()
列表對象的sort()方法用于按照指定的規(guī)則對所有元素進(jìn)行排序;reverse()方法用于將列表所有元素逆序或翻轉(zhuǎn)。
>>> x = list(range(11))?????????????????????? #包含11個整數(shù)的列表
>>> import random
>>> random.shuffle(x)???????????????????????? #把列表x中的元素隨機亂序
>>> x
[6, 0, 1, 7, 4, 3, 2, 8, 5, 10,
9]
>>> x.sort(key=lambdaitem:len(str(item)), reverse=True)?#按轉(zhuǎn)換成字符串以后的長度,降序排列
>>> x
[10, 6, 0, 1, 7, 4, 3, 2, 8, 5,
9]
>>> x.sort(key=str)?????????????????????????? #按轉(zhuǎn)換為字符串后的大小,升序排序
>>> x
[0, 1, 10, 2, 3, 4, 5, 6, 7, 8,
9]
>>> x.sort()????????????????????????????????? #按默認(rèn)規(guī)則排序
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10]
>>> x.reverse()?????????????????????????????? #把所有元素翻轉(zhuǎn)或逆序
>>> x
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
0]
列表對象支持的運算符:
加法運算符+也可以實現(xiàn)列表增加元素的目的,但不屬于原地操作,而是返回新列表,涉及大量元素的復(fù)制,效率非常低。使用復(fù)合賦值運算符+=實現(xiàn)列表追加元素時屬于原地操作,與append()方法一樣高效。
>>> x = [1, 2, 3]
>>> id(x)
53868168
>>> x = x + [4]??????????????????????? #連接兩個列表
>>> x
[1, 2, 3, 4]
>>> id(x)????????????????????????????? #內(nèi)存地址發(fā)生改變
53875720
>>> x += [5]?????????????????????????? #為列表追加元素
>>> x
[1, 2, 3, 4, 5]
>>> id(x)????????????????????????????? #內(nèi)存地址不變
53875720
乘法運算符*可以用于列表和整數(shù)相乘,表示序列重復(fù),返回新列表。運算符*=也可以用于列表元素重復(fù),屬于原地操作。
>>> x = [1, 2, 3, 4]
>>> id(x)
54497224
>>> x = x * 2?????????????????????????? #元素重復(fù),返回新列表
>>> x
[1, 2, 3, 4, 1, 2, 3, 4]
>>> id(x)?????????????????????????????? #地址發(fā)生改變
54603912
>>> x *= 2????????????????????????????? #元素重復(fù),原地進(jìn)行
>>> x
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3,
4, 1, 2, 3, 4]
>>> id(x)?????????????????????????????? #地址不變
54603912
成員測試運算符in可用于測試列表中是否包含某個元素,查詢時間隨著列表長度的增加而線性增加,而同樣的操作對于集合而言則是常數(shù)級的。
>>>
3 in [1, 2, 3]
True
>>>
3 in [1, 2, '3']
False
關(guān)系運算符可以用來比較兩個列表的大小。
>>>[1, 2, 4] > [1, 2, 3, 5]???#逐個比較對應(yīng)位置的元素
??????????????????????????????? #直到某個能夠比較出大小為止
True
>>>
[1, 2, 4] == [1, 2, 3, 5]
False
2.內(nèi)置函數(shù)對列表的操作
max()、min()函數(shù)用于返回列表中所有元素的最大值和最小值,
sum()函數(shù)用于返回列表中所有元素之和;
len()函數(shù)用于返回列表中元素個數(shù),zip()函數(shù)用于將多個列表中元素重新組合為元組并返回包含這些元組的zip對象;
enumerate()函數(shù)返回包含若干下標(biāo)和值的迭代對象;
map()函數(shù)把函數(shù)映射到列表上的每個元素,filter()函數(shù)根據(jù)指定函數(shù)的返回值對列表元素進(jìn)行過濾;
all()函數(shù)用來測試列表中是否所有元素都等價于True,any()用來測試列表中是否有等價于True的元素。
標(biāo)準(zhǔn)庫functools中的reduce()函數(shù)以及標(biāo)準(zhǔn)庫itertools中的compress()、groupby()、dropwhile()等大量函數(shù)也可以對列表進(jìn)行操作。
>>> x = list(range(11))????????????? #生成列表
>>> import random
>>> random.shuffle(x)??????????????? #打亂列表中元素順序
>>> x
[0, 6, 10, 9, 8, 7, 4, 5, 2, 1,
3]
>>> all(x)?????????????????????????? #測試是否所有元素都等價于True
False
>>> any(x)?????????????????????????? #測試是否存在等價于True的元素
True
>>> max(x)?????????????????????????? #返回最大值
10
>>> max(x, key=str)????????????????? #按指定規(guī)則返回最大值
9
>>> min(x)
0
>>> sum(x)??????????????????? #所有元素之和
55
>>> len(x)??????????????????? #列表元素個數(shù)
11
>>> list(zip(x, [1]*11))????? #多列表元素重新組合
[(0, 1), (6, 1), (10, 1), (9, 1),
(8, 1), (7, 1), (4, 1), (5, 1), (2, 1), (1, 1), (3, 1)]
>>> list(zip(range(1,4)))???? #zip()函數(shù)也可以用于一個序列或迭代對象
[(1,), (2,), (3,)]
>>> list(zip(['a', 'b', 'c'],[1, 2]))??? #如果兩個列表不等長,以短的為準(zhǔn)
[('a', 1), ('b', 2)]
>>> enumerate(x)????????????? #枚舉列表元素,返回enumerate對象
<enumerate object at
0x00000000030A9120>
>>> list(enumerate(x))??????? #enumerate對象可以轉(zhuǎn)換為列表、元組、集合
[(0, 0), (1, 6), (2, 10), (3, 9),
(4, 8), (5, 7), (6, 4), (7, 5), (8, 2), (9, 1), (10, 3)]
3.切片
在形式上,切片使用2個冒號分隔的3個數(shù)字來完成。
[start:end:step]
第一個數(shù)字start表示切片開始位置,默認(rèn)為0;
第二個數(shù)字end表示切片截止(但不包含)位置(默認(rèn)為列表長度);
第三個數(shù)字step表示切片的步長(默認(rèn)為1)。
當(dāng)start為0時可以省略,當(dāng)end為列表長度時可以省略,當(dāng)step為1時可以省略,省略步長時還可以同時省略最后一個冒號。
當(dāng)step為負(fù)整數(shù)時,表示反向切片,這時start應(yīng)該在end的右側(cè)才行。
(1)使用切片獲取列表部分元素
使用切片可以返回列表中部分元素組成的新列表。與使用索引作為下標(biāo)訪問列表元素的方法不同,切片操作不會因為下標(biāo)越界而拋出異常,而是簡單地在列表尾部截斷或者返回一個空列表,代碼具有更強的健壯性。
>>>aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
>>>aList[::]???????????????#返回包含原列表中所有元素的新列表
[3,4, 5, 6, 7, 9, 11, 13, 15, 17]
>>>aList[::-1]?????????????#返回包含原列表中所有元素的逆序列表
[17,15, 13, 11, 9, 7, 6, 5, 4, 3]
>>>aList[::2]??????????????#隔一個取一個,獲取偶數(shù)位置的元素
[3,5, 7, 11, 15]
>>>aList[1::2]?????????????#隔一個取一個,獲取奇數(shù)位置的元素
[4,6, 9, 13, 17]
>>>aList[3:6]?????????????? #指定切片的開始和結(jié)束位置
[6,7, 9]
>>> aList[0:100]???????????? #切片結(jié)束位置大于列表長度時,從列表尾部截斷
[3, 4, 5, 6, 7, 9, 11, 13, 15,17]
>>> aList[100]?????????????? #拋出異常,不允許越界訪問
IndexError: list index out of range
>>> aList[100:]????????????? #切片開始位置大于列表長度時,返回空列表
[]
>>> aList[-15:3]???????????? #進(jìn)行必要的截斷處理
[3, 4, 5]
>>> len(aList)
10
>>> aList[3:-10:-1]????????? #位置3在位置-10的右側(cè),-1表示反向切片
[6, 5, 4]
>>> aList[3:-5]????????????? #位置3在位置-5的左側(cè),正向切片
[6, 7]
(2)使用切片為列表增加元素
可以使用切片操作在列表任意位置插入新元素,不影響列表對象的內(nèi)存地址,屬于原地操作。
>>>aList = [3, 5, 7]
>>>aList[len(aList):]
[]
>>>aList[len(aList):] = [9]?????? #在列表尾部增加元素
>>>aList[:0] = [1, 2]????????????#在列表頭部插入多個元素
>>>aList[3:3] = [4]??????????????#在列表中間位置插入元素
>>>aList
[1,2, 3, 4, 5, 7, 9]
(3)使用切片替換和修改列表中的元素
>>> aList = [3, 5, 7, 9]
>>> aList[:3] = [1, 2, 3]?????????? #替換列表元素,等號兩邊的列表長度相等
>>> aList
[1, 2, 3, 9]
>>> aList[3:] = [4, 5, 6]?????????? #切片連續(xù),等號兩邊的列表長度可以不相等
>>> aList
[1, 2, 3, 4, 5, 6]
>>> aList[::2] = [0]*3????????????? #隔一個修改一個
>>> aList
[0, 2, 0, 4, 0, 6]
>>> aList[::2] = ['a', 'b','c']??? #隔一個修改一個
>>> aList
['a', 2, 'b', 4, 'c', 6]
>>> aList[1::2] = range(3)???????????? #序列解包的用法
>>> aList
['a', 0, 'b', 1, 'c', 2]
>>> aList[1::2] = map(lambda x:
x!=5, range(3))
>>> aList
['a', True, 'b', True, 'c', True]
>>> aList[1::2] = zip('abc',
range(3)) #map、filter、zip對象都支持這樣的用法
>>> aList
['a', ('a', 0), 'b', ('b', 1),
'c', ('c', 2)]
>>> aList[::2] = [1]?????????????????? #切片不連續(xù)時等號兩邊列表長度必須相等
ValueError: attempt to assign
sequence of size 1 to extended slice of size 3
(4)使用切片刪除列表中的元素
>>> aList = [3, 5, 7, 9]
>>> aList[:3] = []????????????????? #刪除列表中前3個元素
>>> aList
[9]
也可以結(jié)合使用del命令與切片結(jié)合來刪除列表中的部分元素,并且切片元素可以不連續(xù)。
>>> aList = [3, 5, 7, 9, 11]
>>> del aList[:3]?????????????????? #切片元素連續(xù)
>>> aList
[9, 11]
>>> aList = [3, 5, 7, 9, 11]
>>> del aList[::2]????????????????? #切片元素不連續(xù),隔一個刪一個
>>> aList
[5, 9]