1,list函數
因為字符串不能像列表一樣被修改,所以有時候根據字符串創建列表會很有用。list函數可以實現這個操作:
1 In [1]: list('Hello')
2 Out[1]: ['H', 'e', 'l', 'l', 'o']
提示:可以用''.join(somelist)將一個由字符組成的列表轉換為字符串。注意是字符。可以用str()函數轉換成字符。
2,基本的列表操作
(1)、改變列表:元素賦值
改變列表很容易。但我們並不會用x=2這樣的語句進行賦值,而是使用索引標記來為某個特定的、位置明確的元素賦值,如x[1]=2。
1 In [2]: x = [1, 1, 1]
2
3 In [3]: x[1]=2
4
5 In [4]: x
6 Out[4]: [1, 2, 1]
注意:不能為一個位置不存在的元素進行賦值。如果的列表長度為2,那么不能為索引為100的元素進行賦值。如果要那樣做,就必須創建一個長度為101(或者更長)的列表。
(2)、刪除元素
用del語句即可。
(3)、分片賦值
分片是一個非常強大的特性,分片賦值操作則更加顯現它的強大。
1 In [5]: name = list('Perl')
2
3 In [6]: name
4 Out[6]: ['P', 'e', 'r', 'l']
5
6 In [7]: name[2:] = list('ar')
7
8 In [8]: name
9 Out[8]: ['P', 'e', 'a', 'r']
使用分片賦值是,還可以使用與原序列不等長的序列將分片替換:
1 In [9]: name = list('Perl')
2
3 In [10]: name[1:] = list('ython')
4
5 In [11]: name
6 Out[11]: ['P', 'y', 't', 'h', 'o', 'n']
分片賦值語句可以在不需要替換任何原有元素的情況下插入新的元素:
In [12]: numbers = [1,5]
In [13]: numbers[1:1] = [2,3,4]
In [14]: numbers
Out[14]: [1, 2, 3, 4, 5]
這個程序只是“替換”了一個空的分片,因此實際上的操作是插入了一個序列。以此類推,通過分片賦值來刪除元素也是可行的。
In [17]: numbers[1:4]=[]
In [18]: numbers
Out[18]: [1, 5]
In [19]:
3,列表方法
(1)、append
append方法用於在列表末尾追加新的對象。
In [19]: lst = [1,2,3]
In [20]: lst.append(4)
In [21]: lst
Out[21]: [1, 2, 3, 4]
(2)、count
count方法統計某個元素在列表中出現的次數:
In [22]: ['to','be','or','not','to','be'].count('to')
Out[22]: 2
(3)、extend
extend方法可以在列表的末尾一次性追加另一個序列中的多個值。換句話說,可以用新列表擴展原有的列表:
In [23]: a = [1,2,3]
In [24]: b = [4,5,6]
In [25]: a.extend(b)
In [26]: a
Out[26]: [1, 2, 3, 4, 5, 6]
這個操作看起來很像連接操作,兩者最主要區別在於:extend方法修改了擴展的序列(在這個例子中,就是a)。而原始的連接操作則不然,它會返回一個全新的列表:
In [27]: a = [1,2,3]
In [28]: b = [4,5,6]
In [29]: a+b
Out[29]: [1, 2, 3, 4, 5, 6]
In [30]: a
Out[30]: [1, 2, 3]
可以看到被連接的列表與之前例子中被擴展的列表是一樣的,但是這一次它並沒有被修改。這是因為原始的連接操作創建了一個包含了a和b的副本的新列表。如果使用a=a+b這樣的操作,效率會比extend方法低。當然也可以用分片賦值來實現相同的效果。
(4)、index
index方法用於從列表中找出某個值第一個匹配項的索引位置。當沒有找到時會因為一個ValueError異常。
(5)、insert
insert方法用於將對象插入到列表中:
In [31]: numbers = [1,2,3,5,6,7]
In [32]: numbers.insert(3,'four')
In [33]: numbers
Out[33]: [1, 2, 3, 'four', 5, 6, 7]
與extend方法一樣,insert方法也可以用分片賦值來實現。
In [34]: numbers = [1,2,3,5,6,7]
In [35]: numbers[3:3] = 'four'
In [36]: numbers
Out[36]: [1, 2, 3, 'f', 'o', 'u', 'r', 5, 6, 7]
(6)、pop
pop方法會移除列表中的一個元素(默認是最后一個),並且返回該元素的值:
In [37]: x = [1,2,3]
In [39]: x.pop()
Out[39]: 3
In [40]: x.pop(0)
Out[40]: 1
注意:pop方法是唯一一個既能修改列表又返回元素值(除了None)的列表方法。
使用pop方法可以實現棧。入棧可以用append方法。如果要實現隊列的話,要用pop(0)來代替pop()
(6)、remove
remove方法用於移除列表中某個值的第一個匹配項。
(7)、reverse
reverse方法將列表中的元素反向存放。
(8)、sort
sort方法用於在原位置對列表進行排序。在“原位置排序”意味着改變原來的列表,從而讓其中的元素能按一定的順序排列,而不是簡單地返回一個已排序的列表副本。
In [41]: x = [4,6,3,1,5]
In [42]: x.sort()
In [43]: x
Out[43]: [1, 3, 4, 5, 6]
當需要一個排好序的列表副本,同時又保留原有列表不變的時候,問題就出現了。為了實現這個功能,我們自然而然就想到了如下的做法(實際上是錯誤的):
In [44]: x = [4,6,3,1,5]
In [45]: y = x.sort() #Don't do this
In [46]: print y
None
因為sort方法修改了x卻返回了空值,那么最后得到的是已排序的x以及值為None的y。實現這個功能的正確方法是先把x的副本賦值給y,然后對y排序。
In [47]: x = [4,6,3,1,5]
In [48]: y = x[:]
In [49]: y.sort()
In [50]: y
Out[50]: [1, 3, 4, 5, 6]
In [51]: x
Out[51]: [4, 6, 3, 1, 5]
調用x[:]得到的是包含了x所有元素的分片,這是一種很有效率的復制整個列表的方法。不要用y=x這樣的賦值方式,因為這樣做就讓x和y都指向同一個列表了。
In [52]: x = [4,6,3,1,5]
In [53]: y = x
In [54]: y.sort()
In [55]: y
Out[55]: [1, 3, 4, 5, 6]
In [56]: x
Out[56]: [1, 3, 4, 5, 6]
另一種獲取已排列的列表副本的方法是,使用sorted函數
In [52]: x = [4,6,3,1,5]
In [59]: y = sorted(x)
In [60]: y
Out[60]: [1, 3, 4, 5, 6]
In [61]: x
Out[61]: [4, 6, 3, 1, 5]
這個函數可以用於任何序列/,卻總返回一個列表。
In [62]: sorted('Python')
Out[62]: ['P', 'h', 'n', 'o', 't', 'y']
(10)、高級排序
如果希望元素能按照特定的方式進行排序,那么可以通過compare(x,y)的形式自定義比較函數。compare(x,y)函數會在x < y時返回負數,在x > y時返回正數,如果x == y則返回0。定義好該函數后,就可以提供給sort方法做為參數了。內建cmp函數提供比較函數的實現方式。下面演示降序排列。
In [63]: def compare(x, y):
....: if x > y: return -1
....: if x < y: return 1
....: if x == y: return 0
....:
In [64]: x = [4, 6 ,3, 1, 5]
In [65]: x.sort(compare)
In [66]: x
Out[66]: [6, 5, 4, 3, 1]
sort方法有另外兩個可選的參數——key和reverse。如果要使用它們,那么要通過名字來指定(關鍵字參數)。參數key與cmp類似——必須提供一個在排序過程中使用的函數。然而,該函數並不是直接用來確定對象大小,而是為每個元素創建一個鍵,然后所有元素根據鍵來排序。因此,如果要根據元素的長度來進行排序,那么可以使用len作為鍵函數:
In [67]: x = ['aardvark','abalone','acme','add','aerate']
In [68]: x.sort(key=len)
In [69]: x
Out[69]: ['add', 'acme', 'aerate', 'abalone', 'aardvark']
另一個關鍵字參數reverse是簡單的布爾值(True或False)用來指明列表是否要進行反向排序:
In [70]: x = [4,6,3,1,5]
In [71]: x.sort(reverse=True)
In [72]: x
Out[72]: [6, 5, 4, 3, 1]
cmp,key,reverse參數都可以用於sorted函數。大多數情況下,為cmp或key提供自定義函數是非常有用的。