defaultdict(list)将所有值连接到一个列表中

时间:2015-10-13 16:29:03

标签: python python-2.7 collections anagram 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',]

(所有的字谜都在一起,只要它们在列表中相邻,顺序无关紧要。)

2 个答案:

答案 0 :(得分:1)

当你这样做时 -

output.append(i for i in items)

您实际上是将生成器表达式i for i in items - 附加到output列表中,您也可以从repr列表的output结果中看到。这不会自动评估生成器表达式并添加结果。你应该做的是使用output.extend()。示例 -

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

这将评估表达式,并将iterable(生成器表达式)中的每个元素作为单独元素附加到列表中。

但是如果要从res字典的所有列表值转换单个列表,则更容易使用itertools.chain.from_iterable。示例 -

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

答案 1 :(得分:0)

<强> EDITED

我相信更换

output.append(i for i in items)

output.extend(items)

会做你期望的事。