动态

详情 返回 返回

翻譯:《實用的Python編程》01_05_Lists - 动态 详情

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

1.5 列表

本節介紹 Python 原始數據類型列表(list)。 列表是一種有序的集合。

創建列表

使用方括號 [] 來定義列表字面量。

names = [ 'Elwood', 'Jake', 'Curtis' ]
nums = [ 39, 38, 42, 65, 111]

有時候,列表也可以通過其它方法創建。例如:使用字符串的 split() 方法可以將一個字符串拆分為一個列表:

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

使用加號 + 來拼接列表:

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

列表的長度:

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

user avatar u_17494575 头像 u_16776161 头像 u_17353607 头像 ting_61d6d9790dee8 头像 whaosoft143 头像 sovitjs 头像 u_15641375 头像 eolink 头像 chiqingdezhentou 头像 aitibao_shichangyingxiao 头像 jianghushinian 头像 nixideshatanku 头像
点赞 44 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.