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)
会如您所愿。
我想做什么:
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)
会如您所愿。