翻譯:《實用的Python編程》01_05_Lists

目錄 | 上一節 (1.4 字符串) | 下一節 (1.6 文件)html

1.5 列表

本節介紹 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(',')

練習1.19:提取和從新分配列表元素

嘗試一些查找:

>>> 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')取代。

練習1.20:遍歷列表元素

for 循環能夠遍歷列表這樣的序列。經過輸入下列的循環而且查看發生了什麼來驗證這點:

>>> for s in symlist:
        print('s =', s)
# Look at the output

練習1.21:成員測試

使用 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
>>>

練習 1.22:添加,插入和刪除元素

使用 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']
>>>

衆所周知,沒有方法找到或者刪除某個元素在列表中重複出現的全部項。可是,咱們將會在第二節看到一種優雅的方式去實現它。

練習1.23:排序

想要對一個列表排序嗎?使用 sort() 方法。試試看:

>>> symlist.sort()
>>> symlist
['AA', 'AAPL', 'AIG', 'GOOG', 'HPQ', 'RHT', 'YHOO']
>>>

想要對一個列表倒序嗎?嘗試這個:

>>> symlist.sort(reverse=True)
>>> symlist
['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA']
>>>

注意:對列表排序能夠「原地」修改其內容。也就是說,是對列表的元素進行「洗牌」,而不是建立一個新的列表做爲結果。

練習 1.24:列表轉字符串

想要把一個包含字符串的列表鏈接到一個字符串中嗎?像下面這樣使用字符串的 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'
>>>

練習1.25:包含任何內容的列表

列表能夠包含任何類型的對象,包括列表(示例:嵌套的列表)。試試看:

>>> 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
>>>

儘管在技術上可以生成很是複雜的列表結構,但做爲通常規則,你仍是但願保持簡單。一般,列表存儲類型相同的元素。例如,徹底由數字或者文本字符串構成的列表。在同一個列表中混合不一樣類型的數據,每每會讓人感到頭痛,所以最好避免這種狀況。

目錄 | 上一節 (1.4 字符串) | 下一節 (1.6 文件)

注:完整翻譯見 https://github.com/codists/practical-python-zh

相關文章
相關標籤/搜索