這不是一個錯誤。它與groupby iterable被消耗的時間有關。嘗試用python3下面,你會看到相同的行爲:
from itertools import groupby
for (i,j),k in list(zip(groupby([1,1,2,2,3,3]), [4,5,6])):
print (i,list(j),k)
請注意,如果您刪除外list
,那麼你得到你所期望的結果。這裏的「問題」是石斑魚對象(在j
中返回)是一個迭代器,只要它們是相同的就會產生元素。它不會提前知道它會產生什麼或者有多少元素。它只是接收一個迭代器作爲輸入,然後從那個迭代器中產生。如果你轉向下一個「組」,那麼在你有機會查看元素之前,迭代最終會被消耗掉。這是允許groupby
在產生任意(甚至無限)數量的元素的迭代器上進行設計的決定。
在python2.x中,zip
將創建一個列表,在循環開始前有效地移過每個「組」。在此過程中,它最終會消耗由groupby
返回的每個「組」對象。這就是爲什麼您只列出報表中的最後一個元素。 python2.x的修復程序是使用itertools.izip
而不是zip
。在python3.x中,izip
成爲內建的zip
。正如我所看到的,在這個腳本中支持這兩種方法的唯一方法是通過類似的東西:
from __future__ import print_function
from itertools import groupby
try:
from itertools import izip
except ImportError: #python3.x
izip = zip
for (i,j),k in izip(groupby([1,1,2,2,3,3]), [4,5,6]):
print (i,list(j),k)
偉大的問題!它讓我難住了幾分鐘... – mgilson