【问题标题】:creating dictionary containing list values using a comprehension使用推导式创建包含列表值的字典
【发布时间】:2013-11-20 06:37:47
【问题描述】:

在 python 中,我希望使用带有字符串键和列表值的理解来创建字典。我无法弄清楚的是如何将元素附加到这些列表中。例如考虑我的以下尝试:

{c: [].append(x[0]) for x in g16.nodes(data=True) for c in colors if x[1]['color'] == c}

g16.nodes(data=True) 给出一个对列表,其中第一个元素是字符串,第二个元素是只指定颜色的字典。如前所述,我希望将这个结构变成一个字典,其中键给出颜色,值是具有这种颜色的字符串列表。

如果您有解决方案,或者有更好的方法,请告诉我!

感谢大家的帮助。

【问题讨论】:

  • list.append 返回无,因此所有字典值都将为无。
  • 使用循环,而不是理解。你冒着写出难以理解的理解的风险!
  • 经验法则,如果你必须在理解中变异,那么理解不是解决方案。
  • 我相信if x[1]['color'] in colors 应该足够了,colors 可以是一个可以提供更快查找的集合。

标签: python list dictionary dictionary-comprehension


【解决方案1】:

你正在尝试这样做:

{c: [x[0] for x in g16.nodes(data=True) if x[1]['color'] == c] for c in colors}

但这不是很有效,因为您要为每种颜色循环一次 g16.nodes(data=True)

这样比较好

d = {c: [] for c in colors}
for x in g16.nodes(data=True):
    k = x[1]['color']
    if k in d:
        d[k].append(x[0])

如果你知道k 总是在colors 中,你可以简化为

d = {c: [] for c in colors}
for x in g16.nodes(data=True):
    d[x[1]['color']].append(x[0])

【讨论】:

  • 我只是在输入相同的答案!
  • 您也可以将collections.defaultdict(list) 用于d。这是一个经典的用法。
  • @LaurentLAPORTE,这两种选择的主要区别在于,这一种将所有颜色作为键。以后迭代它时可以有所作为 - 有时你想要带有空列表的键,有时你不需要
【解决方案2】:

使用对列表键字典的理解不会很漂亮。如果你可以试试这个可能会更容易:

假设g16.nodes(data=True) 类似于

[('key1', {'color': 'black'}), ('key2', {'color': 'green')]

并且color 键存在,你可以试试这个:

from collections import defaultdict
gen = ((k, c['color']) for k, c in g16.nodes(data=True) if c['color'] in colors)
results = defaultdict(list)
for key, color in gen:
    results[color].append(key)

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2021-07-28
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多