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) 将所有值连接到一个列表中的主要内容,如果未能解决你的问题,请参考以下文章

XSLT:如何将值连接到全局变量

我无法将 TableViewCell 按钮连接到 TableViewController!如何将 TableViewCell 中的值连接到 TableViewController?

使用pyspark将两个字符串列值连接到整数数组

如何将 2 个字段中的值连接到一个字段中

将字段值连接到 SQL Server 中的字符串

如何在火花中使用逗号分隔符将相同的列值连接到新列