使用理解创建包含列表值的字典

时间:2013-11-20 06:37:47

标签: python list dictionary dictionary-comprehension

在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)给出一个对列表,其中第一个元素是一个字符串,第二个元素是一个只指定颜色的字典。如上所述,我希望将这个结构变成一个字典,其中键给出颜色,值是具有这种颜色的字符串列表。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您正在尝试这样做:

{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])

答案 1 :(得分:0)

使用对列表键的字典的理解并不是很好。如果您可以尝试这样做可能会更容易:

假设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)