python中zip()函數用法舉例
定義:zip([iterable, ...])
zip()是Python的一個內建函數,它接受一系列可迭代的對象作為參數,將對象中對應的元素打包成一個個tuple(元組),然后返回由這些tuples組成的list(列表)。若傳入參數的長度不等,則返回list的長度和參數中長度最短的對象相同。利用*號操作符,可以將list unzip(解壓),看下面的例子就明白了:
示例1 x = [1, 2, 3] y = [4, 5, 6] z = [7, 8, 9] xyz = zip(x, y, z) print xyz運行的結果是: [(1, 4, 7), (2, 5, 8), (3, 6, 9)] 示例2,在兩個list長度不相等時的情況: x = [1, 2, 3] y = [4, 5, 6, 7] xy = zip(x, y) print xy運行的結果是: [(1, 4), (2, 5), (3, 6)] 示例3 >>> name=('jack','beginman','sony','pcky') >>> age=(2001,2003,2005,2000) >>> for a,n in zip(name,age): print a,n 輸出: jack 2001 beginman 2003 sony 2005 pcky 2000
示例4,只有一個list的情況: x = [1, 2, 3] x = zip(x) print x運行的結果是: [(1,), (2,), (3,)] 示例5:
搭配for循環,支持並行迭代操作方法 zip()方法用在for循環中,就會支持並行迭代:
l1 = [2,3,4]
l2 = [4,5,6]
for (x,y) in zip(l1,l2):
print x,y,'--',x*y
2 4 -- 8
3 5 -- 15
4 6 -- 24
其實它的工作原理就是使用了zip()的結果,在for循環里解包zip結果中的元組,用元組賦值運算。就好像(x,y)=(2,6),賦值、序列解包操作。在對文件的操作中我們也會用到遍歷,例如Python遍歷文件夾目錄與文件操作,就是很方便實用的。
示例6:二維矩陣變換(矩陣的行列互換)
比如我們有一個由列表描述的二維矩陣 ,a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],通過python列表推導的方法,我們也能輕易完成這個任務
print [ [row[col] for row in a] for col in range(len(a[0]))] [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
另外一種讓人困惑的方法就是利用zip函數:
>>> 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
示例7:以指定概率獲取元素
>>> 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之間平均取值的,顯然我們的目的已經達到