2017-07-26 69 views
0

我只是與Python開始,但我能理解爲什麼這個調用得到不同的結果爲什麼這兩個調用在Python中不同?

from itertools import izip 
a = ['hello','world','1','2', 'other', 'thing'] 
b = ['hello','world','1','2', 'other', 'thing'] 
i = iter(a) 
i2= iter(b) 
c = dict(izip(i, i2)) 

結果:

{'thing': 'thing', '1': '1', 'other': 'other', '2': '2', 'world': 'world', 'hello': 'hello'} 

from itertools import izip 
a = ['hello','world','1','2', 'other', 'thing'] 
i = iter(a) 
c = dict(izip(i, i)) 

結果:

{'1': '2', 'other': 'thing', 'hello': 'world'} 
+5

相同的迭代器vs不同的迭代器。 –

+1

因爲在第二種情況下,你已經將一個迭代器傳遞給'izip'函數,而且迭代器是一次迭代'izip'將以交織方式從實際迭代中消耗項目。 (每次迭代兩項)。 – Kasramvd

回答

2

迭代器返回的iter將產生來自給定迭代的每個元素只有一次。你可以想象每個迭代器返回iter就好像有一個指向下一個元素的符號。在第一個摘錄中,您有2個標記:ii2,並且在第二個標記中。迭代器支持名爲next的單個操作,該操作將獲取「符號」當前指向的項目,並移動「符號」以使其指向以下元素。


zip(p, q)/izip(p, q)將在內部從p獲得下一個元素,那麼從q和建立這些元素的元組,併產生它;然後重複只要pq都有next元素。

在第一種情況下,有2個獨立的迭代器。因此ii2都將產生它們各自列表中的所有元素。我將在此介紹它採用簡單的代碼和zip - 作爲獎金,這是Python的3兼容:

>>> a = [1, 2, 3, 4] 
>>> p = iter(a) 
>>> q = iter(a) 
>>> list(zip(p, q)) 
[(1, 1), (2, 2), (3, 3), (4, 4)] 

在您在相同迭代兩次經過第二種情況。 izip仍然認爲它有2個迭代器;所以izip會先問pnext元素,然後qnext元素 - 但只有一個迭代器 - 所以izip將看到來自p未來每第二個元素,以及每秒從q

>>> a = [1, 2, 3, 4] 
>>> p = iter(a) 
>>> q = p 
>>> q is p 
True 
>>> list(zip(p, q)) 
[(1, 2), (3, 4)] 

最後,dict,當給出元組可迭代時,將構造一個字典,其中每個元組的第一個元素成爲一個關鍵字,第二個元素成爲該關鍵字的值。因此:

>>> dict([(1, 1), (2, 2), (3, 3), (4, 4)]) 
{1: 1, 2: 2, 3: 3, 4: 4} 

>>> dict([(1, 2), (3, 4)]) 
{1: 2, 3: 4} 

順便說一句,這個代碼是不必要的複雜:

a = ['hello', 'world', '1', '2', 'other', 'thing'] 
b = ['hello', 'world', '1', '2', 'other', 'thing'] 
i = iter(a) 
i2= iter(b) 
c = dict(izip(i, i2)) 

首先,列表不必重複 - 你可以有2個迭代器迭代相同的列表,他們將獨立工作,即你可以有

i2 = iter(a) 

仍然得到相同的結果,b在這裏是不必要的。

其次,大多數時候你不需要明確地創建迭代器 - 隱式會做。因此,第一種情況的代碼可以簡寫爲

a = ['hello', 'world', '1', '2', 'other', 'thing'] 
c = dict(zip(a, a)) 
相關問題