文實例講述了Python中zip()函數的定義及用法,相信對於Python初學者有一定的借鑑價值。詳情如下:
一、定義:
zip([iterable, ...])
zip()是Python的一個內建函數,它接受一系列可迭代的對象作爲參數,將對象中對應的元素打包成一個個tuple(元組),然後返回由這些tuples組成的list(列表)。若傳入參數的長度不等,則返回list的長度和參數中長度最短的對象相同。利用*號操作符,可以將list unzip(解壓)。
二、用法示例:
讀者看看下面的例子,對zip()函數的基本用法就可以明白了:
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 )]
|
對於這個並不是很常用函數,下面舉幾個例子說明它的用法:
1.二維矩陣變換(矩陣的行列互換)
比如我們有一個由列表描述的二維矩陣
1
|
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
2.以指定概率獲取元素
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之間平均取值的,顯然我們的目的已經達到。