2014-08-29 18 views
3

雖然試圖解決一個特定的問題,我遇到了一個特定的情況,我很難理解的行爲。意想不到的行爲壓縮迭代器的序列

該場景是,zip帶有序列的迭代器,並且在轉置操作之後,迭代器是預期元素之後的迭代器。

>>> l = range(10) 
>>> it = iter(l) 
>>> zip(it, range(5)) 
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] 
>>> next(it) #expecting 5 here 
6 

我是否缺少明顯的東西?

注意請的答案可能不是很明顯

回答

3

我懷疑,當zip試圖壓縮的下一個項目5消耗提供可靠的參考。當其arg的一個是「空」郵編停止:

>>> l = range(10) 
>>> it = iter(l) 
>>> zip(range(5),it) 
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] 
>>> it.next() 
5 

通過反向排序,拉鍊知道它可以停止,並且不消耗下一個項目從它

+0

'我懷疑,當郵編嘗試訪問下一步時會消耗5個郵件,但爲什麼會這樣。這顯然是明顯的,但我需要知道爲什麼? – Abhijit 2014-08-29 15:15:50

+1

在第六次迭代中,'zip'首先要做的就是調用你的迭代器。然後它會進入'範圍',這將失敗,並且壓縮停止。但是你不能不重複這個項目並重新獲得'5'。你不得不前進,所以'5'永遠失去了時間。 – TheSoundDefense 2014-08-29 15:16:20

+0

@Ahhijit當其一個參數「空」時,Zip停止。但爲了知道它是否爲空,它必須在其上執行'.next()'。 – fredtantini 2014-08-29 15:18:52

1

如果你想引用你可以檢查izip documentation。它給出了一個等效的實現:

def izip(*iterables): 
    iterators = map(iter, iterables) 
    while iterators: 
     yield tuple(map(next, iterators)) 

由於list(izip(*args))預計將有相同的行爲zip(*args),你得到的結果卻是合乎邏輯的行爲。