请问怎么合并几个python字典

我必须合并python字典列表。例如:


dicts[0] = {'a':1, 'b':2, 'c':3}

dicts[1] = {'a':1, 'd':2, 'c':'foo'}

dicts[2] = {'e':57,'c':3}


super_dict = {'a':[1], 'b':[2], 'c':[3,'foo'], 'd':[2], 'e':[57]}    

我写了以下代码:


super_dict = {}

for d in dicts:

    for k, v in d.items():

        if super_dict.get(k) is None:

            super_dict[k] = []

        if v not in super_dict.get(k):

            super_dict[k].append(v)

可以更优雅地展示/优化吗?


请注意, 我在SO上发现了另一个问题,但它恰好是合并2个字典。


婷婷同学_
浏览 344回答 3
3回答

一只斗牛犬

您可以直接迭代字典-无需使用range。该setdefault字典的方法查找的关键,如果找到返回值。如果找不到,它将返回默认值,并将该默认值分配给密钥。super_dict = {}for d in dicts:    for k, v in d.iteritems():  # d.items() in Python 3+        super_dict.setdefault(k, []).append(v)另外,您可以考虑使用defaultdict。这只是setdefault通过调用一个函数来自动执行,该函数在找不到键时返回默认值。import collectionssuper_dict = collections.defaultdict(list)for d in dicts:    for k, v in d.iteritems():  # d.items() in Python 3+        super_dict[k].append(v)而且,正如Sven Marnach的观察一样,您似乎不希望列表中的值重复。在这种情况下,set可以为您提供所需的东西:import collectionssuper_dict = collections.defaultdict(set)for d in dicts:    for k, v in d.iteritems():  # d.items() in Python 3+        super_dict[k].add(v)

白猪掌柜的

from collections import defaultdictdicts = [{'a':1, 'b':2, 'c':3},         {'a':1, 'd':2, 'c':'foo'},         {'e':57, 'c':3} ]super_dict = defaultdict(set)  # uses set to avoid duplicatesfor d in dicts:    for k, v in d.items():  # use d.iteritems() in python 2        super_dict[k].add(v)

子衿沉夜

合并所有字典的键,并为每个键组合值列表:super_dict = {}for k in set(k for d in dicts for k in d):    super_dict[k] = [d[k] for d in dicts if k in d]该表达式set(k for d in dicts for k in d)构建所有词典的所有唯一键的集合。对于这些独特的按键,我们使用列表理解[d[k] for d in dicts if k in d],从这个键中的所有类型的字典构建值的列表。由于您似乎只是每个键的唯一值之一,因此您可能想使用集合:super_dict = {}for k in set(k for d in dicts for k in d):    super_dict[k] = set(d[k] for d in dicts if k in d)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python