定義:zip([iterable, ...])
zip()是python的乙個內建函式,它接受一系列可迭代的物件作為引數,將物件中對應的元素打包成乙個個tuple(元組),然後返回由這些tuples組成的list(列表)。若傳入引數的長度不等,則返回list的長度和引數中長度最短的物件相同。利用*號操作符,可以將list unzip(解壓),看下面的例子就明白了:
>>>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列表推導的方法,我們也能輕易完成這個任務
print[[
row[
col]
forrow ina
]for
col
inrange
(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
>>>
import
random
>>>
defrandom_pick
(seq
,probabilities
):x
=random
.uniform(0
,1)cumulative_probability
=0.0
foritem
,item_probability
inzip
(seq
,probabilities
):cumulative_probability
+=item_probability
ifx <
cumulative_probability
:break
return
item
>>>
fori
inrange(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之間平均取值的,顯然我們的目的已經達到
Python中zip 函式用法舉例
定義 zip iterable,zip 是python的乙個內建函式,它接受一系列可迭代的物件作為引數,將物件中對應的元素打包成乙個個tuple 元組 然後返回由這些tuples組成的list 列表 若傳入引數的長度不等,則返回list的長度和引數中長度最短的物件相同。利用 號操作符,可以將list...
python中zip 函式的用法
zip函式的原型為 zip iterable,引數iterable為可迭代的物件,並且可以有多個引數。該函式返回乙個以元組為元素的列表,其中第 i 個元組包含每個引數序列的第 i 個元素。返回的列表長度被截斷為最短的引數序列的長度。只有乙個序列引數時,它返回乙個1元組的列表。沒有引數時,它返回乙個空...
python中zip 函式的用法
zip函式的原型為 zip iterable,引數iterable為可迭代的物件,並且可以有多個引數。該函式返回乙個以元組為元素的列表,其中第 i 個元組包含每個引數序列的第 i 個元素。返回的列表長度被截斷為最短的引數序列的長度。只有乙個序列引數時,它返回乙個1元組的列表。沒有引數時,它返回乙個空...