天天看點

Python list 和 tuple

list

Python内置的一種資料類型是清單:​

​list​

​​。​

​list​

​是一種有序的集合,可以随時添加和删除其中的元素。

比如,列出班裡所有同學的名字,就可以用一個​

​list​

​表示:

>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']      

變量​

​classmates​

​​就是一個​

​list​

​​。用​

​len()​

​​函數可以獲得​

​list​

​元素的個數:

>>> len(classmates)
3      
用索引來通路`list`中每一個位置的元素,記得索引是從`0`開始的:      
>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[2]
'Tracy'
>>> classmates[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in      

當索引超出了範圍時,​

​Python​

​​會報一個​

​IndexError​

​​錯誤,是以,要確定索引不要越界,記得最後一個元素的索引是​

​len(classmates) - 1​

​。

如果要取最後一個元素,除了計算索引位置外,還可以用​

​-1​

​做索引,直接擷取最後一個元素:

>>> classmates[-1]
'Tracy'      

以此類推,可以擷取倒數第2個、倒數第3個:

>>> classmates[-2]
'Bob'
>>> classmates[-3]
'Michael'
>>> classmates[-4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range      

當然,倒數第4個就越界了。

​list​

​​是一個可變的有序表,是以,可以往​

​list​

​中追加元素到末尾:

>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']      

也可以把元素插入到指定的位置,比如索引号為​

​1​

​的位置:

>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']      

要删除​

​list​

​​末尾的元素,用​

​pop()​

​方法:

>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']      

要删除指定位置的元素,用​

​pop(i)​

​​方法,其中​

​i​

​是索引位置:

>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']      

要把某個元素替換成别的元素,可以直接指派給對應的索引位置:

>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']      

​list​

​裡面的元素的資料類型也可以不同,比如:

>>> L = ['Apple', 123, True]      

​list​

​​元素也可以是另一個​

​list​

​,比如:

>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4      

要注意​

​s​

​​隻有4個元素,其中​

​s[2]​

​​又是一個​

​list​

​,如果拆開寫就更容易了解了:

>>> p = ['asp', 'php']
>>> s = ['python', 'java', p, 'scheme']      

要拿到​

​'php'​

​​可以寫​

​p[1]​

​​或者​

​s[2][1]​

​,是以s可以看成是一個二維數組,類似的還有三維、四維……數組,不過很少用到。

如果一個​

​list​

​​中一個元素也沒有,就是一個空的​

​list​

​,它的長度為0:

>>> L = []
>>> len(L)
0      

​tuple​

另一種有序清單叫元組:​

​tuple​

​​。​

​tuple​

​​和​

​list​

​​非常類似,但是​

​tuple​

​一旦初始化就不能修改,比如同樣是列出同學的名字:

>>> classmates = ('Michael', 'Bob', 'Tracy')      

現在,​

​classmates​

​​這個​

​tuple​

​​不能變了,它也沒有​

​append()​

​​,​

​insert()​

​​這樣的方法。其他擷取元素的方法和​

​list​

​​是一樣的,你可以正常地使用​

​classmates[0]​

​​,​

​classmates[-1]​

​,但不能指派成另外的元素。

不可變的​

​tuple​

​​有什麼意義?因為​

​tuple​

​​不可變,是以代碼更安全。如果可能,能用​

​tuple​

​​代替​

​list​

​​就盡量用​

​tuple​

​。

​tuple​

​​的陷阱:當你定義一個​

​tuple​

​​時,在定義的時候,​

​tuple​

​的元素就必須被确定下來,比如:

>>> t = (1, 2)
>>> t
(1, 2)      

如果要定義一個空的​

​tuple​

​​,可以寫成​

​()​

​:

>>> t = ()
>>> t
()      

但是,要定義一個隻有1個元素的​

​tuple​

​,如果你這麼定義:

>>> t = (1)
>>> t
1      

定義的不是​

​tuple​

​​,是​

​1​

​​這個數!這是因為括号​

​()​

​​既可以表示​

​tuple​

​​,又可以表示數學公式中的小括号,這就産生了歧義,是以,​

​Python​

​規定,這種情況下,按小括号進行計算,計算結果自然是1。

是以,​

​隻有​

​​1​

​個元素的​

​​tuple​

​定義時必須加一個逗号​

​​,​

​,來消除歧義​

​:

>>> t = (1,)
>>> t
(1,)      

​Python​

​​在顯示隻有1個元素的​

​tuple​

​​時,也會加一個逗号​

​,​

​,以免你誤解成數學計算意義上的括号。

最後來看一個“可變的”​

​tuple​

​:

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])      

這個​

​tuple​

​​定義的時候有3個元素,分别是​

​'a'​

​​,​

​'b'​

​​和一個​

​list​

​​。不是說​

​tuple​

​一旦定義後就不可變了嗎?怎麼後來又變了?

别急,我們先看看定義的時候​

​tuple​

​包含的3個元素:

Python list 和 tuple

當我們把​

​list​

​​的元素​

​'A'​

​​和​

​'B'​

​​修改為​

​'X'​

​​和​

​'Y'​

​​後,​

​tuple​

​變為:

Python list 和 tuple

the_list.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

classmates = ['Michael', 'Bob', 'Tracy']
print('classmates =', classmates)
print('len(classmates) =', len(classmates))
print('classmates[0] =', classmates[0])
print('classmates[1] =', classmates[1])
print('classmates[2] =', classmates[2])
print('classmates[-1] =', classmates[-1])
classmates.pop()
print('classmates =', classmates)      

the_tuple.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

classmates = ('Michael', 'Bob', 'Tracy')
print('classmates =', classmates)
print('len(classmates) =', len(classmates))
print('classmates[0] =', classmates[0])
print('classmates[1] =', classmates[1])
print('classmates[2] =', classmates[2])
print('classmates[-1] =', classmates[-1])

# cannot modify tuple:
classmates[0] = 'Adam'