2017-04-17 76 views
1

我試圖將itertools.groupby的結果解碼爲值列表。Python列表理解不適用於itertools.groupby解碼

我的來源是:

x = [(1, 2), (2, 1), (6, 3), (6, 5), (1, 3)] 

在原來的方法是用做的聲明是這樣的:

keyfunc = itemgetter(0) 
groups = [] 
uniquekeys = [] 
data = sorted(x, key=keyfunc) 
for k, g in itertools.groupby(data, keyfunc): 
    groups.append(list(g))  # Store group iterator as a list 
    uniquekeys.append(k) 

我選擇使用列表理解,使其在一個行:

[(k, list(g)) for k, g in list(itertools.groupby(x, keyfunc))] 

第一種方法的結果是:

[1, 2, 6] #for uniquekeys 
[[(1, 2), (1, 3)], [(2, 1)], [(6, 3), (6, 5)]] #for groups 

這是完全合理的。

第二種方法的結果是:

[(1, []), (2, []), (6, [(6, 5)])] 

這裏我們可以看到的基團是空的或單一的保持整數。

它出錯了?

+2

只需使用'[(k,list(g))for k,g in itertools.groupby(x,keyfunc)]' –

+0

Thanks @ThierryLathuille,Works! –

+1

@ThierryLathuille雖然爲什麼會有所作爲? –

回答

1

問題是list(itertools.groupby(x, keyfunc))中的列表。只要放下它,它應該工作。

list(itertools...在您的示例中有四個迭代器,它們都共享相同的基礎迭代器。通過構建列表,你有效地用盡了前三個迭代器來創建第四個,從而使整個事情不可用。通過刪除顯式列表,您可以從迭代器跳轉到迭代器。

+0

謝謝,就是這樣。 –