defaultdict(list) 将所有值连接到一个列表中
Posted
技术标签:
【中文标题】defaultdict(list) 将所有值连接到一个列表中【英文标题】:defaultdict(list) concatenating all the values into one list 【发布时间】:2016-01-11 12:21:06 【问题描述】:我想做什么:
编写一个方法来对一个字符串数组进行排序,这样所有的 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',]
(所有字谜都在一起,顺序无关紧要,只要它们在列表中相邻即可。)
【问题讨论】:
你能更新你期望的输出吗?D
是什么?
很抱歉给您带来了困惑。我已经更新了我的问题。
【参考方案1】:
当你这样做时 -
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 = [ i for i in items ]
我不认为列表理解会是 - output = [i for v in res.values() for i in v]
。
@RobertB 但我还是更喜欢 chain.from_iterable
。这就是专门为此而设计的。
注意extend(i for i in items)
只是extend(items)
的一种奇怪的写法。
是的,正确,我只是添加了这一点,以指出需要 extend
而不是 append
。我还是建议chain
。【参考方案2】:
已编辑
我相信替换
output.append(i for i in items)
与
output.extend(items)
会做你期望的。
【讨论】:
这会将列表附加到output
中,而不是预期的输出。此外,这可以写为output.append(items)
。完全没有区别,因为items
已经是一个列表。
这类作品。它会创建一个列表列表,例如[['k'], ['foo', 'ofo', 'oof'], ['poo'], ['fo']]
。我一直在寻找一个列表,但很高兴知道这一点。
已编辑,但已接受的答案已提供此解决方案。以上是关于defaultdict(list) 将所有值连接到一个列表中的主要内容,如果未能解决你的问题,请参考以下文章
我无法将 TableViewCell 按钮连接到 TableViewController!如何将 TableViewCell 中的值连接到 TableViewController?