1. 程式人生 > >Python中zip()函式用法舉例

Python中zip()函式用法舉例

定義:zip([iterable, ...])
zip()是Python的一個內建函式,它接受一系列可迭代的物件作為引數,將物件中對應的元素打包成一個個tuple(元組),然後返回由這些 tuples組成的list(列表)。若傳入引數的長度不等,則返回list的長度和引數中長度最短的物件相同。利用*號操作符,可以將list unzip(解壓),看下面的例子就明白了:

1 2 3 4 5 6 7 8 9 
>>> a = [1,2,3] >>> b = [4,5,6] >>> c = [4,5,6,7,8] >>>
zipped = zip(a,b) [(1, 4), (2, 5), (3, 6)] >>> zip(a,c) [(1, 4), (2, 5), (3, 6)] >>> zip(*zipped) [(1, 2, 3), (4, 5, 6)]

對於這個並不是很常用函式,下面舉幾個例子說明它的用法:

* 二維矩陣變換(矩陣的行列互換)

比如我們有一個由列表描述的二維矩陣
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
通過python列表推導的方法,我們也能輕易完成這個任務

1 2 
print [ [row[col]
for row in a] for col in range(len(a[0]))] [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

另外一種讓人困惑的方法就是利用zip函式:

1 2 3 4 5 
>>> a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> zip(*a) [(1, 4, 7), (2, 5, 8), (3, 6, 9)] >>> map(list,zip(*a)) [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

這種方法速度更快但也更難以理解,將list看成tuple解壓,恰好得到我們“行列互換”的效果,再通過對每個元素應用list()函式,將tuple轉換為list

* 以指定概率獲取元素

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
>>> import random >>> def random_pick(seq,probabilities): 	x = random.uniform(0, 1) 	cumulative_probability = 0.0 	for item, item_probability in zip(seq, probabilities): 		cumulative_probability += item_probability 		if x < cumulative_probability: break 	return item   >>> for i in range(15): 	random_pick("abc",[0.1,0.3,0.6])   'c' 'b' 'c' 'c' 'a' 'b' 'c' 'c' 'c' 'a' 'b' 'b' 'c' 'a' 'c'

這個函式有個限制,指定概率的列表必須和元素一一對應,而且和為1,否則這個函式可能不能像預想的那樣工作。
稍微解釋下,先利用random.uniform()函式生成一個0-1之間的隨機數並複製給x,利用zip()函式將元素和他對應的概率打包成tuple,然後將每個元素的概率進行疊加,直到和大於x終止迴圈
這樣,”a”被選中的概率就是x取值位於0-0.1的概率,同理”b”為0.1-0.4,”c”為0.4-1.0,假設x是在0-1之間平均取值的,顯然我們的目的已經達到