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

defaultdict(list) concatenating all the values into one list

我想做什么:

Write a method to sort an array of strings so that all the anagrms are next to each other.

我有以下代码:

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',]

(所有的变位词都放在一起,顺序无关紧要,只要它们在列表中相邻即可。)

当你这样做时 -

output.append(i for i in items)

您实际上是将生成器表达式 - i for i in items - 附加到 output 列表中,正如您还可以从 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']

已编辑

我相信替换

output.append(i for i in items)

output.extend(items)

会如您所愿。