在保持重复键的同时,从键,值元组列表创建一个dict

时间:2011-07-22 19:54:54

标签: python

所以我对...的影响有了理解:

dict((x.key, x.value) for x in y)

问题当然是,如果有多个x.key具有相同的值,则它们会与最后x.value折叠,并且该特定x.key是唯一幸存的成员。我想实际将结果dict的值设为列表:

{
    'key1': ['value1'],
    'key2': ['value2', 'value3', 'value4'],
    'key3': ['value5'],
    # etc.
}

这种逻辑是否可以理解?

3 个答案:

答案 0 :(得分:19)

默认情况下,您可以逐个将元素添加到包含空列表的字典中:

import collections

result_dict = collections.defaultdict(list)
for x in y:
    result_dict[x.key].append(x.value)

您还可以执行非常类似的操作,而无需使用集合模块:

result_dict = {}
for x in y:
    result_dict.setdefault(x.key, []).append(x.value)

但这可以说略显不易清晰。

等效,更易读(不需要“解析”不太常见的setdefault)但更多的行人,基础Python方法是:

result_dict = {}
for x in y:
    if x.key not in result_dict:
        result_dict[x.key] = []
    result_dict[x.key].append(x.value)

第一种解决方案显然是首选解决方案,因为它同时简洁,清晰,快速。

答案 1 :(得分:2)

不。你不能理解这一点。

但您可以使用itertools.groupby

答案 2 :(得分:1)

我不是说这是正确的做法,而是出于纯粹的求知欲..

您可以使用itertools.groupbylambda在一个字典理解中执行此操作,如果这是您真正想要做的事情:(其中l是您要制作的元组列表a dict出自:

dict((k, [v[1] for v in vs]) for (k, vs) in itertools.groupby(l, lambda x: x[0]))