字符串和元組是不可變的,而列表是可變(mutable)的,可以對(duì)它進(jìn)行隨意修改。我們還可以將字符串和元組轉(zhuǎn)換成一個(gè)列表,只需使用 list 函數(shù),比如:
>>> s = 'hello'
>>> list(s)
['h', 'e', 'l', 'l', 'o']
>>> a = (1, 2, 3)
>>> list(a)
[1, 2, 3]
本文主要介紹常用的列表方法:
index 方法用于從列表中找出某個(gè)元素的位置,如果有多個(gè)相同的元素,則返回第一個(gè)元素的位置。
看看例子:
>>> numbers = [1, 2, 3, 4, 5, 5, 7, 8]
>>> numbers.index(5) # 列表有兩個(gè) 5,返回第一個(gè)元素的位置
4
>>> numbers.index(2)
1
>>> words = ['hello', 'world', 'you', 'me', 'he']
>>> words.index('me')
3
>>> words.index('her') # 如果沒(méi)找到元素,則會(huì)拋出異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 'her' is not in list
count 方法用于統(tǒng)計(jì)某個(gè)元素在列表中出現(xiàn)的次數(shù)。
看看例子:
>>> numbers = [1, 2, 3, 4, 5, 5, 6, 7]
>>> numbers.count(2) # 出現(xiàn)一次
1
>>> numbers.count(5) # 出現(xiàn)了兩次
2
>>> numbers.count(9) # 沒(méi)有該元素,返回 0
0
append 方法用于在列表末尾增加新的元素。
看看例子:
>>> numbers = [1, 2, 3, 4, 5, 5, 6, 7]
>>> numbers.append(8) # 增加 8 這個(gè)元素
>>> numbers
[1, 2, 3, 4, 5, 5, 6, 7, 8]
>>> numbers.append([9, 10]) # 增加 [9, 10] 這個(gè)元素
>>> numbers
[1, 2, 3, 4, 5, 5, 6, 7, 8, [9, 10]]
extend 方法將一個(gè)新列表的元素添加到原列表中。
看看例子:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
>>>
>>> a.extend(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> a.extend([3])
>>> a
[1, 2, 3, 4, 5, 6, 3]
注意到,雖然 append 和 extend 可接收一個(gè)列表作為參數(shù),但是 append 方法是將其作為一個(gè)元素添加到列表中,而 extend 則是將新列表的元素逐個(gè)添加到原列表中。
insert 方法用于將某個(gè)元素添加到某個(gè)位置。
看看例子:
>>> numbers = [1, 2, 3, 4, 5, 6]
>>> numbers.insert(3, 9)
>>> numbers
[1, 2, 3, 9, 4, 5, 6]
pop 方法用于移除列表中的一個(gè)元素(默認(rèn)是最后一個(gè)),并且返回該元素的值。
看看例子:
>>> numbers = [1, 2, 3, 4, 5, 6]
>>> numbers.pop()
6
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers.pop(3)
4
>>> numbers
[1, 2, 3, 5]
remove 方法用于移除列表中的某個(gè)匹配元素,如果有多個(gè)匹配,則移除第一個(gè)。
看看例子:
>>> numbers = [1, 2, 3, 5, 6, 7, 5, 8]
>>> numbers.remove(5) # 有兩個(gè) 5,移除第 1 個(gè)
>>> numbers
[1, 2, 3, 6, 7, 5, 8]
>>> numbers.remove(9) # 沒(méi)有匹配的元素,拋出異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
reverse 方法用于將列表中的元素進(jìn)行反轉(zhuǎn)。
看看例子:
>>> numbers = [1, 2, 3, 5, 6, 7, 5, 8]
>>> numbers.reverse()
>>> numbers
[8, 5, 7, 6, 5, 3, 2, 1]
sort 方法用于對(duì)列表進(jìn)行排序,注意該方法會(huì)改變?cè)瓉?lái)的列表,而不是返回新的排序列表,另外,sort 方法的返回值是空。
看看例子:
>>> a = [4, 3, 6, 8, 9, 1]
>>> b = a.sort()
>>> b == None # 返回值為空
True
>>> a
[1, 3, 4, 6, 8, 9] # 原列表已經(jīng)發(fā)生改變
如果我們不想改變?cè)斜?,而是希望返回一個(gè)排序后的列表,可以使用 sorted 函數(shù),如下:
>>> a = [4, 3, 6, 8, 9, 1]
>>> b = sorted(a) # 返回一個(gè)排序后的列表
>>> a
[4, 3, 6, 8, 9, 1] # 原列表沒(méi)有改變
>>> b
[1, 3, 4, 6, 8, 9] # 這是對(duì)原列表排序后的列表
注意到,不管是 sort 方法還是 sorted 函數(shù),默認(rèn)排序都是升序排序。如果你想要降序排序,就需要指定排序參數(shù)了。比如,對(duì) sort 方法,可以添加一個(gè) reverse 關(guān)鍵字參數(shù),如下:
>>> a = [4, 3, 6, 8, 9, 1]
>>> a.sort(reverse=True) # 反向排序
>>> a
[9, 8, 6, 4, 3, 1]
該參數(shù)對(duì) sorted 函數(shù)同樣適用:
>>> a = [4, 3, 6, 8, 9, 1]
>>> sorted(a, reverse=True)
[9, 8, 6, 4, 3, 1]
除了 reverse 關(guān)鍵字參數(shù),還可以指定 key 關(guān)鍵字參數(shù),它為每個(gè)元素創(chuàng)建一個(gè)鍵,然后所有元素按照這個(gè)鍵來(lái)排序,比如我們想根據(jù)元素的長(zhǎng)度來(lái)排序:
>>> s = ['ccc', 'a', 'bb', 'dddd']
>>> s.sort(key=len) # 使用 len 作為鍵函數(shù),根據(jù)元素長(zhǎng)度排序
>>> s
['a', 'bb', 'ccc', 'dddd']
另外,我們還可以使用 sorted 進(jìn)行多列(屬性)排序。
看看例子:
>>> students = [
('john', 'B', 15),
('jane', 'A', 12),
('dave', 'B', 10),
('ethan', 'C', 20),
('peter', 'B', 20),
('mike', 'C', 16)
]
>>>
# 對(duì)第 3 列排序 (從小到大)
>>> sorted(students, key=lambda student: student[2])
[('dave', 'B', 10),
('jane', 'A', 12),
('john', 'B', 15),
('mike', 'C', 16),
('ethan', 'C', 20),
('peter', 'B', 20)]
# 對(duì)第 2 列排序(從小到大),再對(duì)第 3 列從大到小排序
>>> sorted(students, key=lambda student: (student[1], -student[2]))
[('jane', 'A', 12),
('peter', 'B', 20),
('john', 'B', 15),
('dave', 'B', 10),
('ethan', 'C', 20),
('mike', 'C', 16)]
如果你想了解更多關(guān)于排序的知識(shí),可以參考此文。