我想做什么:
编写一个方法来对字符串数组进行排序,以便所有的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 :(得分: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)
会做你期望的事。