2015年10月13日 星期二

[ Python 文章收集 ] Python 中 zip() 函數用法實例教程

Source From Here 
Preface 
本文實例講述了Python中 zip() 函數的定義及用法,相信對於Python初學者有一定的借鑒價值。 

一、定義: 
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)
>>> zipped
[(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() 函數與 map() 函數: 
>>> 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_prob = 0.0
... for item, item_prob in zip(seq, probabilities):
... cumulative_prob+=item_prob
... if x < cumulative_prob:
... return item
...
>>> for i in range(10):
... random_pick("abc", [0.1, 0.3, 0.6])
...
'b'
'c'
'b'
'c'
'a'
'b'
'c'
'b'
'c'
'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之間平均取值的,顯然我們的目的已經達到。

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...