列表屬于容器存儲(chǔ)、可變跃巡、順序訪問(wèn)的數(shù)據(jù)類(lèi)型危号。列表可以包含任何種類(lèi)的對(duì)象或者嵌套,借助列表可以構(gòu)造許多復(fù)雜的數(shù)據(jù)結(jié)構(gòu)素邪,因此列表也是平時(shí)最經(jīng)常用到的數(shù)據(jù)類(lèi)型外莲。
1. 創(chuàng)建列表
列表使用方括號(hào) [ ]
來(lái)定義,直接把一個(gè)被 [ ]
包含,并由逗號(hào) ,
分隔的數(shù)據(jù)賦值給一個(gè)變量即可創(chuàng)建列表對(duì)象偷线。
>>> li = [1, 2, 3] # 通過(guò)直接將列表賦值來(lái)創(chuàng)建列表數(shù)據(jù)對(duì)象
>>> li
[1, 2, 3]
>>> li = [ ] # 在方括號(hào)中不包含任何數(shù)據(jù)磨确,一個(gè)空列表
>>> li
[ ]
>>> li = [1, 'a', [3]] # 列表中可以包含任意類(lèi)型的數(shù)據(jù)對(duì)象
>>> li
[1, 'a', [3]]
還可以使用 list()
函數(shù)創(chuàng)建列表對(duì)象
>>> li = list('abcd')
>>>li
['a', 'b', 'c', 'd']
2. 列表的基本操作
-
訪問(wèn)列表元素
列表屬于順序訪問(wèn)的數(shù)據(jù)類(lèi)型,因此列表可以通過(guò)索引和切片來(lái)訪問(wèn)列表中的元素
li = [1, 2, 3, 4, 5, 6, 7]
li[0] # 列表索引和字符串一樣声邦,從 0 開(kāi)始乏奥,最大為列表的長(zhǎng)度 - 1
1
li[-1] # 使用負(fù)索引訪問(wèn)列表元素
7
li[1:3] # 列表的切片操作返回一個(gè)包含列表部分元素的新的列表
[2, 3]
li[::-1] # 反序訪問(wèn)列表
[7, 6, 5, 4, 3, 2, 1]
li = [[1, 2, 3]]
li[0][1] # 列表中嵌套的任意序列數(shù)據(jù)類(lèi)型的訪問(wèn)
2
```
-
修改列表
等號(hào)左側(cè)使用索引或切片指定要更改的元素位置,等號(hào)右側(cè)為要更改的值即可對(duì)列表元素進(jìn)行修改
li = [1, 2, 3]
li[0] = 0 # 對(duì)指定索引的元素重新賦值即可修改列表
li
[0, 2, 3]
li[:2] = [7, 7] # 對(duì)切片進(jìn)行重新賦值修改列表
li
[7, 7, 3]
li[:2] = 3 # 列表的一個(gè)切片為新的列表亥曹,因此修改時(shí)等號(hào)右邊也必須時(shí)一個(gè)列表邓了,否則會(huì)引發(fā)一個(gè) TypeError 錯(cuò)誤
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
li[:2] = [3] # 對(duì)切片重新賦值不需要等號(hào)左右兩側(cè)的長(zhǎng)度相同,但有可能會(huì)改變?cè)斜淼拈L(zhǎng)度
li
[3, 3]
```
-
刪除列表元素
指定列表索引或切片媳瞪,使用
del
關(guān)鍵字即可刪除列表元素骗炉。另外列表還有一些專(zhuān)門(mén)用來(lái)刪除元素的方法,后邊介紹蛇受。
li = [1, 2, 3]
del li[0] # 指定要?jiǎng)h除列表的索引痕鳍,使用 del 刪除列表元素
li
[2, 3]
del li[:] # 如果 del 后為切片,則將整個(gè)切片進(jìn)行刪除
li
[ ]
```
3. 序列的操作符和函數(shù)
操作符
-
+
操作符:對(duì)列表使用 + 操作符可以將多個(gè)列表合并為一個(gè)列表
list1 = [0, 1, 2]
list2 = [3, 4, 5]
list1 + list2
[0, 1, 2, 3, 4, 5] # + 操作符將列表合并
```
-
*
操作符:使用 * 操作符可以將列表重復(fù) N 次
li = [1, 2, 3]
li * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3] # * 操作符后便跟數(shù)字龙巨,表示重復(fù) N 次
```
-
in
和not in
:成員關(guān)系操作笼呆,測(cè)試對(duì)象是否是列表的成員
li = [1, 2, 3]
1 in li # 當(dāng)測(cè)試對(duì)象在列表中時(shí)返回 True
True
0 in li # 當(dāng)測(cè)試對(duì)象不在列表中時(shí)返回 False
False
[1, 2] in li # 測(cè)試對(duì)象整體視為列表中的一個(gè)元素
False
```
序列函數(shù)
僅就常見(jiàn)函數(shù)進(jìn)行舉例說(shuō)明
-
len():返回列表中包含的元素個(gè)數(shù)
li = [1, 2, 3]
len(li) # 返回列表長(zhǎng)度
3
li = [1, 2, [1, 2, 3]] # 列表長(zhǎng)度為列表中元素的個(gè)數(shù)
len(li)
3
```
-
max() 和 min():返回列表中的最大或最小元素。注意:混合類(lèi)型進(jìn)行比較往往精度較差旨别,通常這樣做也不會(huì)有什么實(shí)際意義诗赌,因此建議盡量減少不同類(lèi)型對(duì)象的比較
li = [1, 2, 3]
max(li) # 返回列表中的最大值
3
min(li) # 返回列表中的最小值
1
```
-
sorted() :對(duì)列表中的元素進(jìn)行排序
li = ['b', 'a', 'c']
sorted(li) # 將列表中的元素按照從小到大的順序進(jìn)行排序
['a', 'b', 'c']
```
reversed()、enumerate() 秸弛、zip() :用法參考 字符串 中的描述
-
sum():如果列表中的對(duì)象均為數(shù)字铭若,則可以使用 sum() 函數(shù)進(jìn)行求和
li = [1, 2, 3]
sum(li) # 將純數(shù)字組成的列表進(jìn)行元素求和list1 = [0, 1, 2]
>>> list2 = [3, 4, 5]
>>> list1 + list2
[0, 1, 2, 3, 4, 5] # + 操作符將列表合并
- `*` 操作符:使用 * 操作符可以將列表重復(fù) N 次
>>> li = [1, 2, 3]
>>> li * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3] # * 操作符后便跟數(shù)字,表示重復(fù) N 次
- `in` 和 `not in` :成員關(guān)系操作递览,測(cè)試對(duì)象是否是列表的成員
>>> li = [1, 2, 3]
>>> 1 in li # 當(dāng)測(cè)試對(duì)象在列表中時(shí)返回 True
True
>>> 0 in li # 當(dāng)測(cè)試對(duì)象不在列表中時(shí)返回 False
False
>>> [1, 2] in li # 測(cè)試對(duì)象整體視為列表中的一個(gè)元素
False
##### 序列函數(shù) 僅就常見(jiàn)函數(shù)進(jìn)行舉例說(shuō)明 - __len()__:返回列表中包含的元素個(gè)數(shù)
>>> li = [1, 2, 3]
>>> len(li) # 返回列表長(zhǎng)度
3
>>> li = [1, 2, [1, 2, 3]] # 列表長(zhǎng)度為列表中元素的個(gè)數(shù)
>>> len(li)
3
- __max()__ 和 __min()__:返回列表中的最大或最小元素叼屠。注意:混合類(lèi)型進(jìn)行比較往往精度較差,通常這樣做也不會(huì)有什么實(shí)際意義绞铃,因此建議盡量減少不同類(lèi)型對(duì)象的比較
>>> li = [1, 2, 3]
>>> max(li) # 返回列表中的最大值
3
>>> min(li) # 返回列表中的最小值
1
- __sorted()__ :對(duì)列表中的元素進(jìn)行排序
>>> li = ['b', 'a', 'c']
>>> sorted(li) # 將列表中的元素按照從小到大的順序進(jìn)行排序
['a', 'b', 'c']
- __reversed()__镜雨、__enumerate()__ 、__zip()__ :用法參考 [字符串](http://www.reibang.com/p/28b17449d92f) 中的描述 - __sum()__:如果列表中的對(duì)象均為數(shù)字儿捧,則可以使用 __sum()__ 函數(shù)進(jìn)行求和
>>> li = [1, 2, 3]
>>> sum(li) # 將純數(shù)字組成的列表進(jìn)行元素求和
6
sum(li, 4) # sum 函數(shù)可以有第二個(gè)參數(shù)荚坞,但第二個(gè)參數(shù)只能是數(shù)字,否則會(huì)報(bào)錯(cuò)
10
```
4. 列表內(nèi)建函數(shù)
-
append(obj):在列表后邊追加一個(gè)元素
li = [1, 2, 3]
li.append(4) # append 只接受一個(gè)參數(shù)菲盾,并將該參數(shù)添加的列表的末尾
li
[1, 2, 3, 4]
```
-
insert(index, obj):指定要插入位置的索引颓影,將元素插入到列表中
li = [1, 2, 3]
li.insert(1, 'a') # insert 第一個(gè)參數(shù)為要插入位置的索引,第二個(gè)參數(shù)為要插入列表的對(duì)象
li
[1, 'a', 2, 3]
```
-
extend(list):將參數(shù)列表的內(nèi)容添加到列表的結(jié)尾
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2) # 調(diào)用 extend 函數(shù)可以擴(kuò)展列表
list1
[1, 2, 3, 4, 5, 6]
```
-
remove(obj)懒鉴;從列表中刪除指定元素
li = [1, 2, 3]
li.remove(2) # 刪除指定元素
li
[1, 3]
li = [1, 2, 3, 1]
li.remove(1) # 如果列表中存在多個(gè)指定的元素诡挂,則刪除索引最小的那個(gè)
li
[2, 3, 1]
li.remove(4) # 當(dāng)試圖刪除一個(gè)列表中不存在的元素時(shí)會(huì)引發(fā)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
```
-
pop(index=-1):刪除并返回指定位置的對(duì)象,默認(rèn)為最后一個(gè)
li = [1, 2, 3]
li.pop() # 默認(rèn)刪除并返回列表中的最后一個(gè)元素
3
li
[1, 2]
li.pop(0) # 可以指定元素的索引值,刪除并返回該元素
1
li
[2]
li.pop(3) # 指定的索引值越界時(shí)引發(fā)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
```
-
index(obj, i = 0, j = len (list) ):返回 obj 在列表中的索引璃俗,范圍為 i - j
li = [1, 2, 3, 1]
li.index(2) # 查找并返回元素的索引
1
li.index(1) # 如果存在多個(gè)元素南捂,返回找到的一個(gè)索引
0
li.index(7) # 查找的元素在列表中不存在時(shí),引起異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
list1 = [1, 2, 3]
>>> list2 = [4, 5, 6]
>>> list1.extend(list2) # 調(diào)用 extend 函數(shù)可以擴(kuò)展列表
>>> list1
[1, 2, 3, 4, 5, 6]
- __remove(obj)__旧找;從列表中刪除指定元素
>>> li = [1, 2, 3]
>>> li.remove(2) # 刪除指定元素
>>> li
[1, 3]
>>> li = [1, 2, 3, 1]
>>> li.remove(1) # 如果列表中存在多個(gè)指定的元素,則刪除索引最小的那個(gè)
>>> li
[2, 3, 1]
>>> li.remove(4) # 當(dāng)試圖刪除一個(gè)列表中不存在的元素時(shí)會(huì)引發(fā)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
- __pop(index=-1)__:刪除并返回指定位置的對(duì)象麦牺,默認(rèn)為最后一個(gè)
>>> li = [1, 2, 3]
>>> li.pop() # 默認(rèn)刪除并返回列表中的最后一個(gè)元素
3
>>> li
[1, 2]
>>> li.pop(0) # 可以指定元素的索引值钮蛛,刪除并返回該元素
1
>>> li
[2]
>>> li.pop(3) # 指定的索引值越界時(shí)引發(fā)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
- __index(obj, i = 0, j = len (list) )__:返回 obj 在列表中的索引,范圍為 i - j
>>> li = [1, 2, 3, 1]
>>> li.index(2) # 查找并返回元素的索引
1
>>> li.index(1) # 如果存在多個(gè)元素剖膳,返回找到的一個(gè)索引
0
>>> li.index(7) # 查找的元素在列表中不存在時(shí)魏颓,引起異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 7 is not in list
```
-
count(obj):返回 obj 在列表中出現(xiàn)的次數(shù)
li = [1, 2, 3, 1]
li.count(1) # 返回對(duì)象在列表中出現(xiàn)的次數(shù)
2
li.count(7) # 如果列表中不存在該對(duì)象,不會(huì)引發(fā)異常吱晒,而是返回 0
0
```
-
sort(func = None, key = None, reverse = False):以指定方式對(duì)列表進(jìn)行排序甸饱,當(dāng) reverse = True 時(shí)反序排列
li = [1, 2, 3, 1]
li.sort() # 對(duì)列表使用 sort 函數(shù)會(huì)直接對(duì)列表進(jìn)行修改
li
[1, 1, 2, 3]
li.sort(reverse = True) # 當(dāng) reverse = True 時(shí)反序排列
li
[3, 2, 1, 1]
```
-
reverse():原地就地反轉(zhuǎn)列表
li = [1, 2, 3, 1]
li.reverse()
li
[1, 3, 2, 1]
```
-
除此之外列表還有非常強(qiáng)大的列表解析,這里暫不列出仑濒,僅舉一個(gè)例子叹话。
[i for i in [1, 2, 3, 4, 5, 6, 7, 8, 9] if i % 2 == 0 ]
[2, 4, 6, 8] # 篩選出偶數(shù)并構(gòu)建出對(duì)應(yīng)的列表
```
5. 使用列表構(gòu)建一些數(shù)據(jù)結(jié)構(gòu)
- 堆棧:堆棧是一個(gè)后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),可以通過(guò)列表來(lái)創(chuàng)建堆棧墩瞳。
stack = []
def stack_push(): # 將對(duì)象加入堆棧中
stack.append(raw_input("Enter New Object :").strip())
def stack_pop(): # 將對(duì)象從堆棧中刪除驼壶,后進(jìn)先出
if len(stack) == 0:
print "Can not pop object from an empty stack !"
else:
print "Remove ", stack.pop()
- 隊(duì)列:隊(duì)列是一個(gè)先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)
queue = []
def queue_push(): # 將對(duì)象加入到隊(duì)列中
queue.append(raw_input("Enter New Object :").strip())
def queue_pop(): # 將對(duì)象從隊(duì)列中刪除,先進(jìn)先出
if len(queue) == 0:
print "Can not pop object from empty queue !"
else:
print "Remove", queue.pop(0)
- 使用列表可以創(chuàng)建許多復(fù)雜的數(shù)據(jù)結(jié)構(gòu)喉酌,列表也是我們最常用的 Python 數(shù)據(jù)類(lèi)型
6. 更多關(guān)于列表的參考:
思考
現(xiàn)有一列表:
`a = [1, 3, 4, 0, 1, 5, 5, 1, 5, 1, 5, 6, 2, 3, 1, 5, 3]`
刪除所有 5
元素前面的 1
热凹,同時(shí)在所有的 3
后添加 3 個(gè) 2
一種 Python 的思路
>>> a = [1, 3, 4, 0, 1, 5, 5, 1, 5, 1, 5, 6, 2, 3, 1, 5, 3]
>>> ','.join( [str(i) for i in a] ).replace('1,5', '5').replace('3', '3,2,2,2').split(',')
['1', '3', '2', '2', '2', '4', '0', '5', '5', '5', '5', '6', '2', '3', '2', '2', '2', '5', '3', '2', '2', '2']