2013年5月16日 星期四

python 串列與tuple

繼字串之後,再來要說明的是串列(list)與tuple。串列與tuple非常類似,唯一的差別在於: 串列可以修改,而tuple不能修改。

串列與tuple裡面的成員可以是任何的物件,數字、字串、其他串列或tuple,甚至是辭典、function物件...。它們也可以像字串一樣使用索引、切片來取得其中的成員。

串列使用中括號,tuple使用小括號,例如:
>>> a = [123, 'abc', [111,222], (333,444)]
>>> print a[0]
123
>>> print a[2][1]
222
>>> print a[3][1]
444

上例中,串列中包含數字123, 字串abc, 另一個串列[111,222], 與tuple (333,444)
串列與tuple的索引與切片使用方式與字串完全相同,請參考Python字串

相加

串列或tuple可以相加,前題是串列必須與串列相加,tuple則必須與tuple相加,最後會傳回新的串列或tuple。
 >>> a = [111,222] + [333,444] + [555,666]
>>> a
[111, 222, 333, 444, 555, 666]
>>>
>>> b = ('aaa','bbb') + ('ccc','ddd')
>>> b
('aaa', 'bbb', 'ccc', 'ddd')

但如果要將串列與tulple相加,則會發生錯誤
>>> c = a + b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list

若有需要將串列與tuple相加,則必須呼叫list函式將資料轉成list,或tuple函式將資料轉成tuple再相加。
>>> c = a + list(b)
>>> c
[111, 222, 333, 444, 555, 666, 'aaa', 'bbb', 'ccc', 'ddd']
>>>
>>> c = tuple(a) + b
>>> c
(111, 222, 333, 444, 555, 666, 'aaa', 'bbb', 'ccc', 'ddd')

相乘

可以將串列或tuple重複數倍。類似字串的乘法。
>>> a = [111,222]
>>> a * 3
[111, 222, 111, 222, 111, 222]
>>>
>>> b = ('aaa','bbb')
>>> b * 5
('aaa', 'bbb', 'aaa', 'bbb', 'aaa', 'bbb', 'aaa', 'bbb', 'aaa', 'bbb')

修改

適當之處修改只適用於串列,不適用於tuple。
將串列裡的'abc'換成另一個字串:
>>> a = [123, 'abc', [111,222], (333,444)]
>>> a[1] = 'xyz'
>>> a
[123, 'xyz', [111, 222], (333, 444)]

也可以一次置換多個成員,且數量可以不同(更多或更少)
>>> a = [123, 'abc', [111,222], (333,444)]
>>> a[0:2] = ['aaa','bbb','ccc']
>>> a
['aaa', 'bbb', 'ccc', [111, 222], (333, 444)]

上例將123,'abc'換成'aaa','bbb','ccc'

刪除

刪除成員只適用於串列,不適用於tuple。
刪除也非常方便
>>> a = [123, 'abc', [111,222], (333,444)]
>>> a[1:3] = []
>>> a
[123, (333, 444)]

另外,刪除也可以用 del 敘述
>>> a = [123, 'abc', [111,222], (333,444)]
>>> del a[1:3]
>>> a
[123, (333, 444)]

 不用索引的方式刪除,也可以呼叫remove方法依內容來刪除, 但限制一次只能刪除一個成員。
>>> a = [123, 'abc', [111,222], (333,444)]
>>> a.remove('abc')
>>> a
[123, [111, 222], (333, 444)]
>>>
>>> a.remove([111,222])
>>> a
[123, (333, 444)]

append與pop

新增成員只適用於串列,不適用於tuple。
可以呼叫append方法,增加成員到串列。
>>> a = [123,456]
>>> a.append(789)
>>> a
[123, 456, 789]

呼叫pop取出串列成員,可以指定索引,若不指定則預設為最後一個,並在取出後從串列刪除該成員。
>>> a = [111,222,333,444,555]
>>> a.pop()
555
>>> a
[111, 222, 333, 444]
>>> a.pop(0)
111
>>> a
[222, 333, 444]

其他

關於tuple有一個更偷懶的方法,就是不加小括號
>>> a = 111, 222, 333
>>> a
(111, 222, 333)

但如果只有一個項目,不管有沒有加小括號都要在後面加逗號
 >>> a = 111,
>>> a
(111,)
>>> a = (111,)
>>> a
(111,)
>>> b = 111
>>> b
111
>>> b = (111)
>>> b
111
 上例b因沒有加逗號,而被誤認為數字111

python因為有了串列與tuple,可以省掉很多製作資料結構所花費的心力,可以更專注在要解決的問題。有一個用法也很方便,就是要交換2個變數值,以傳統C語言的寫法可能會是:
temp  = a;
a = b;
b = temp;

在python可以這麼寫:
>>> a = 1
>>> b = 2
>>> a, b = b, a
>>> a
2
>>> b
1

看到了吧,只要一行 a, b = b, a 是不是更直覺了呢?

4 則留言: