目錄 | 上一節 (1.4 字符串) | 下一節 (1.6 文件)html
本節介紹 Python 原始數據類型列表(list)。 列表是一種有序的集合。python
使用方括號 [] 來定義列表字面量。git
names = [ 'Elwood', 'Jake', 'Curtis' ] nums = [ 39, 38, 42, 65, 111]
有時候,列表也能夠經過其它方法建立。例如:使用字符串的 split()
方法能夠將一個字符串拆分爲一個列表:github
>>> line = 'GOOG,100,490.10' >>> row = line.split(',') >>> row ['GOOG', '100', '490.10'] >>>
列表能夠存儲任何類型的項(譯註:item,或者稱爲元素)。使用 append()
方法添加一個新的項:編程
names.append('Murphy') # Adds at end names.insert(2, 'Aretha') # Inserts in middle
使用加號 + 來拼接列表:app
s = [1, 2, 3] t = ['a', 'b'] s + t # [1, 2, 3, 'a', 'b']
列表經過整數進行索引,索引從 0 開始。編程語言
names = [ 'Elwood', 'Jake', 'Curtis' ] names[0] # 'Elwood' names[1] # 'Jake' names[2] # 'Curtis'
負索引從列表尾部開始計數:函數
names[-1] # 'Curtis'
你能夠改變列表中的任何項:測試
names[1] = 'Joliet Jake' names # [ 'Elwood', 'Joliet Jake', 'Curtis' ]
列表的長度:spa
names = ['Elwood','Jake','Curtis'] len(names) # 3
成員測試(in
, not in
):
'Elwood' in names # True 'Britney' not in names # True
複製(s * n
):
s = [1, 2, 3] s * 3 # [1, 2, 3, 1, 2, 3, 1, 2, 3]
使用 for
遍歷列表內容:
for name in names: # use name # e.g. print(name) ...
這和其它編程語言的 foreach
語句相似。
爲了快速找到某項的位置(索引),使用 index()
函數:
names = ['Elwood','Jake','Curtis'] names.index('Curtis') # 2
若是元素出現不止一次,index()
方法將會返回元素第一次出現的索引。
若是元素沒有找到,index()
方法將引起 ValueError
異常。
你能夠按元素值或者按索引刪除元素:
# Using the value names.remove('Curtis') # Using the index del names[1]
移除一個元素不會「留空」。其它的元素將會移動來填充刪除元素後騰出的空間。若是元素出現不止一次,remove()
方法將只刪除第一次出現的元素。
列表能夠「原地」排序:
s = [10, 1, 7, 3] s.sort() # [1, 3, 7, 10] # Reverse order s = [10, 1, 7, 3] s.sort(reverse=True) # [10, 7, 3, 1] # It works with any ordered data s = ['foo', 'bar', 'spam'] s.sort() # ['bar', 'foo', 'spam']
若是你想生成一個新的列表,使用 sorted()
函數:
t = sorted(s) # s unchanged, t holds sorted values
警告:列表不是爲數學運算而設計的:
>>> nums = [1, 2, 3, 4, 5] >>> nums * 2 [1, 2, 3, 4, 5, 1, 2, 3, 4, 5] >>> nums + [10, 11, 12, 13, 14] [1, 2, 3, 4, 5, 10, 11, 12, 13, 14]
特別地,列表沒法像 MATLAB, Octave, R 那樣表示向量/矩陣。可是,有一些包能夠幫助你解決這個問題(例如:numpy)。
在本次練習中,咱們嘗試使用 Python 的列表數據類型。在上一節中,你使用了包含股票代碼的字符串:
>>> symbols = 'HPQ,AAPL,IBM,MSFT,YHOO,DOA,GOOG'
使用字符串的 split()
方法把 symbols 拆分爲一個包含股票代碼名字的列表:
>>> symlist = symbols.split(',')
嘗試一些查找:
>>> symlist[0] 'HPQ' >>> symlist[1] 'AAPL' >>> symlist[-1] 'GOOG' >>> symlist[-2] 'DOA' >>>
嘗試從新分配一個值:
>>> symlist[2] = 'AIG' >>> symlist ['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'DOA', 'GOOG'] >>>
切片:
>>> symlist[0:3] ['HPQ', 'AAPL', 'AIG'] >>> symlist[-2:] ['DOA', 'GOOG'] >>>
建立一個空的列表並添加一個元素到其中:
>>> mysyms = [] >>> mysyms.append('GOOG') >>> mysyms ['GOOG']
你能夠將一個列表的一部分從新分配到另外一個列表中。例如:
>>> symlist[-2:] = mysyms >>> symlist ['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG'] >>>
當執行此操做時,左手邊的列表(symlist
)的大小將會被適當調整,以適應右手邊的列表。
例如,在上面的實例中,symlist
的最後兩項被 mysyms
列表中的單個元素('GOOG')取代。
for
循環能夠遍歷列表這樣的序列。經過輸入下列的循環而且查看發生了什麼來驗證這點:
>>> for s in symlist: print('s =', s) # Look at the output
使用 in
或者 not in
操做符來檢查 'AIG'
,'AA'
,和 'CAT'
是否在 symbols 列表中:
>>> # Is 'AIG' IN the `symlist`? True >>> # Is 'AA' IN the `symlist`? False >>> # Is 'CAT' NOT IN the `symlist`? True >>>
使用 append()
方法把 'RHT'
添加到列表 symlist
的末尾:
>>> # append 'RHT' >>> symlist ['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG', 'RHT'] >>>
使用 insert()
方法把 'AA'
做爲列表的第二個元素插入到列表中:
>>> # Insert 'AA' as the second item in the list >>> symlist ['HPQ', 'AA', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG', 'RHT'] >>>
使用 remove()
方法從列表中刪除 'MSFT'
:
>>> # Remove 'MSFT' >>> symlist ['HPQ', 'AA', 'AAPL', 'AIG', 'YHOO', 'GOOG', 'RHT'] >>>
添加一個重複的 'YHOO'
條目到列表的末尾。
注意:列表有重複的值是徹底沒有問題的:
>>> # Append 'YHOO' >>> symlist ['HPQ', 'AA', 'AAPL', 'AIG', 'YHOO', 'GOOG', 'RHT', 'YHOO'] >>>
使用 index()
方法查看 'YHOO'
在列表中的第一個位置:
>>> # Find the first index of 'YHOO' 4 >>> symlist[4] 'YHOO' >>>
統計 'YHOO'
在列表中出現了多少次:
>>> symlist.count('YHOO') 2 >>>
刪除第一次出現的 'YHOO'
:
>>> # Remove first occurrence 'YHOO' >>> symlist ['HPQ', 'AA', 'AAPL', 'AIG', 'GOOG', 'RHT', 'YHOO'] >>>
衆所周知,沒有方法找到或者刪除某個元素在列表中重複出現的全部項。可是,咱們將會在第二節看到一種優雅的方式去實現它。
想要對一個列表排序嗎?使用 sort()
方法。試試看:
>>> symlist.sort() >>> symlist ['AA', 'AAPL', 'AIG', 'GOOG', 'HPQ', 'RHT', 'YHOO'] >>>
想要對一個列表倒序嗎?嘗試這個:
>>> symlist.sort(reverse=True) >>> symlist ['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA'] >>>
注意:對列表排序能夠「原地」修改其內容。也就是說,是對列表的元素進行「洗牌」,而不是建立一個新的列表做爲結果。
想要把一個包含字符串的列表鏈接到一個字符串中嗎?像下面這樣使用字符串的 join()
方法實現(注意:這初看起來頗有趣):
>>> a = ','.join(symlist) >>> a 'YHOO,RHT,HPQ,GOOG,AIG,AAPL,AA' >>> b = ':'.join(symlist) >>> b 'YHOO:RHT:HPQ:GOOG:AIG:AAPL:AA' >>> c = ''.join(symlist) >>> c 'YHOORHTHPQGOOGAIGAAPLAA' >>>
列表能夠包含任何類型的對象,包括列表(示例:嵌套的列表)。試試看:
>>> nums = [101, 102, 103] >>> items = ['spam', symlist, nums] >>> items ['spam', ['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA'], [101, 102, 103]]
請注意上面的輸出,items
是一個包含三個元素的列表,第一個元素是一個字符串,其它兩個元素是列表。
你能夠經過多個索引操做來訪問嵌套列表的項。
>>> items[0] 'spam' >>> items[0][0] 's' >>> items[1] ['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA'] >>> items[1][1] 'RHT' >>> items[1][1][2] 'T' >>> items[2] [101, 102, 103] >>> items[2][1] 102 >>>
儘管在技術上可以生成很是複雜的列表結構,但做爲通常規則,你仍是但願保持簡單。一般,列表存儲類型相同的元素。例如,徹底由數字或者文本字符串構成的列表。在同一個列表中混合不一樣類型的數據,每每會讓人感到頭痛,所以最好避免這種狀況。