为了账号安全,请及时绑定邮箱和手机立即绑定

请问怎么合并几个python字典

请问怎么合并几个python字典

婷婷同学_ 2019-11-03 08:04:57
我必须合并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个字典。
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

您可以直接迭代字典-无需使用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 collections

super_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 collections

super_dict = collections.defaultdict(set)

for d in dicts:

    for k, v in d.iteritems():  # d.items() in Python 3+

        super_dict[k].add(v)



查看完整回答
反对 回复 2019-11-04
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

from collections import defaultdict


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

         {'a':1, 'd':2, 'c':'foo'},

         {'e':57, 'c':3} ]


super_dict = defaultdict(set)  # uses set to avoid duplicates


for d in dicts:

    for k, v in d.items():  # use d.iteritems() in python 2

        super_dict[k].add(v)



查看完整回答
反对 回复 2019-11-04
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

合并所有字典的键,并为每个键组合值列表:


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)



查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 343 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信