2015-10-13 54 views
1

我所試圖做的事:defaultdict(名單)連接所有的值轉換成一個列表

寫方法,使所有的anagrms是 彼此相鄰排序字符串數組。

我有以下代碼:

from collections import defaultdict 
res = defaultdict(list) 
L = ['foo', 'poo', 'k', 'fo', 'ofo', 'oof'] 

for w in L: 
    res["".join(sorted(w))].append(w) 

但現在我想要把所有的值res並將它們組合成一個列表。

我嘗試這樣做:

output =[] 
for items in res.values(): 
    output.append(i for i in items) 

但是,這給了我:

>>> output 
[<generator object <genexpr> at 0x102a4d1e0>, <generator object <genexpr> at 0x102a95870>, <generator object <genexpr> at 0x102a958c0>, <generator object <genexpr> at 0x102a95910>] 

如何顯示在一個列表中正確的項目?

期望:

['foo','ofo', 'oof','poo', 'k', 'fo',] 

(所有字謎在一起,爲了不只要它們在列表中相鄰的事情。)

+0

你能更新你所期望的輸出嗎?什麼是'D'? –

+0

對不起,我感到困惑。我更新了我的問題。 – ApathyBear

回答

1

當你這樣做 -

output.append(i for i in items) 

您實際上將生成器表達式 - i for i in items - 附加到output列表中,因爲您還可以從repr的結果中看到列表。這不會自動評估生成器表達式並添加結果。你應該做的是使用output.extend()。實施例 -

>>> output = [] 
>>> for items in res.values(): 
...  output.extend(items) 
... 
>>> output 
['fo', 'k', 'foo', 'ofo', 'oof', 'poo'] 

這將計算表達式,並從可迭代(發電機表達)與列表中的每個元素追加爲單獨的元件。


,但如果你想一個列表從res字典的所有列表值轉換,一個更簡單的方法是使用itertools.chain.from_iterable。示例 -

>>> from itertools import chain 
>>> output = list(chain.from_iterable(res.values())) 
>>> output 
['fo', 'k', 'foo', 'ofo', 'oof', 'poo'] 
+0

或者只是使用列表理解權? '輸出= [我爲我在項目中]' – RobertB

+0

我不認爲列表理解應該是 - 輸出= [我爲v在res.values()爲我在v]'。 –

+1

@RobertB但我仍然更喜歡'鏈。from_iterable'。這具體是爲了什麼。 –

0

EDITED

相信隨着

output.extend(items) 

更換

output.append(i for i in items) 

會做你的期望。

+1

這會將列表追加到'output'中,而不是預期的輸出。另外,這可以寫成'output.append(items)'。因爲'items'已經是一個列表,所以沒有任何區別。 –

+1

這類作品。它創建一個列表,如'[['k'],['foo','ofo','oof'],['poo'],['fo']]'。我正在尋找一個單子,但這是很好的知道。 – ApathyBear

+0

已編輯,但已接受的答案已提供此解決方案。 – maccinza

相關問題