zip函數應用
例1:
zip([1,2,3],['a','b','c'])
結果是
[(1, 'a'), (2, 'b'), (3, 'c')]
就是依次取出每一個數組的元素,然后組合
操作數可以更多
zip([1,2,3],['a','b','c'],[4,5,6])也是可以的
如果元素長度不一致會被砍到一樣長
zip(*list)是上述操作的逆操作
zip(*[(1, 'a'), (2, 'b'), (3, 'c')])的結果是[1,2,3],['a','b','c']
一、定義:
zip([iterable, ...])
zip()是Python的一個內建函數,它接受一系列可迭代的對象作為參數,將對象中對應的元素打包成一個個tuple(元組),然后返回由這些tuples組成的list(列表)。若傳入參數的長度不等,則返回list的長度和參數中長度最短的對象相同。利用*號操作符,可以將list unzip(解壓)。
二、用法示例:
讀者看看下面的例子,對zip()函數的基本用法就可以明白了:
>>> 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)]
對于這個并不是很常用函數,下面舉幾個例子說明它的用法:
1.二維矩陣變換(矩陣的行列互換)
比如我們有一個由列表描述的二維矩陣
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
2.以指定概率獲取元素
>>> 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之間平均取值的,顯然我們的目的已經達到。
zip函數接受任意多個(包括0個和1個)序列作為參數,返回一個tuple列表。具體意思不好用文字來表述,直接看示例:
1.示例1:
x = [1, 2, 3]
y= [4, 5, 6]
z= [7, 8, 9]
xyz=zip(x, y, z)printxyz
運行的結果是:
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
從這個結果可以看出zip函數的基本運作方式。
2.示例2:
x = [1, 2, 3]
y= [4, 5, 6, 7]
xy=zip(x, y)printxy
運行的結果是:
[(1, 4), (2, 5), (3, 6)]
從這個結果可以看出zip函數的長度處理方式。
3.示例3:
x = [1, 2, 3]
x=zip(x)printx
運行的結果是:
[(1,), (2,), (3,)]
從這個結果可以看出zip函數在只有一個參數時運作的方式。
4.示例4:
x =zip()printx
運行的結果是:
[]
從這個結果可以看出zip函數在沒有參數時運作的方式。
5.示例5:
x = [1, 2, 3]
y= [4, 5, 6]
z= [7, 8, 9]
xyz=zip(x, y, z)
u= zip(*xyz)printu
運行的結果是:
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
一般認為這是一個unzip的過程,它的運行機制是這樣的:
在運行zip(*xyz)之前,xyz的值是:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
那么,zip(*xyz) 等價于 zip((1, 4, 7), (2, 5, 8), (3, 6, 9))
所以,運行結果是:[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
注:在函數調用中使用*list/tuple的方式表示將list/tuple分開,作為位置參數傳遞給對應函數(前提是對應函數支持不定個數的位置參數)
6.示例6:
x = [1, 2, 3]
r= zip(* [x] * 3)printr
運行的結果是:
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]
它的運行機制是這樣的:
[x]生成一個列表的列表,它只有一個元素x
[x] * 3生成一個列表的列表,它有3個元素,[x, x, x]
zip(* [x] * 3)的意思就明確了,zip(x, x, x)