2015-10-13 56 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

相关问题