如何合并多个词典

时间:2016-02-16 10:12:16

标签: python dictionary

我有main_dict。

main_dict={'name1':{'key1':'value1', 'key2':'value2'}, 'name2':{'key1':'value3', 'key2':'value8'} ... }

我还有2个其他词典,它们会在main_dict中添加更多数据。

喜欢,

**age_dict= {{'age':'age_value1', 'name': 'name1'}, {'age':'age_value1', 'name': 'name2'}}
gender_dict= {{'gender':'gen_value1', 'name': 'name1'}, {'gender':'gen_value2', 'name': 'name2'}}**

现在我想制作一些循环并合并这些词典 它检查相同的名称,并从年龄和性别词典中获取值,并创建密钥' age' ,'性别'并将它们添加到main_dict中。

现在我已经这样做了,但我认为django可以帮助这样做:

for user in age_dict:
    for key, value in main_dict.iteritems():
        if key == user['name']:
            value['age'] = user['age_value']

for user in gender_dict:
    for key, value in main_dict.iteritems():
        if key == user['name']:
            value['gender'] = user['gen_value']

编辑:修改了age_dict和gender_dict。

3 个答案:

答案 0 :(得分:1)

一般提示:如果您正在执行类似

的操作
for key, val in some_dict.iteritems():
    if key == some_value:
       do_something(val)

你很可能做错了,因为你没有非常使用词典:通过键访问元素。相反,做

do_something(some_dict[key])

如果您无法确定somedict[key]是否存在,请使用例外。

您无需在字典上进行交互即可找到合适的密钥。只需直接访问它,这就是字典的用途:

main_dict={'name1':{'key1':'value1', 'key2':'value2'}, 'name2':{'key1':'value3', 'key2':'value8'}}


age_dicts = [{'age':'age_value1', 'name': 'name1'}, 'age':'age_value1', 'name': 'name2'}]
gender_dicts = [{'gender':'gen_value1', 'name': 'name1'}, 'gender':'gen_value2', 'name': 'name2'}]

for dct in age_dicts:
    main_dict[dct['name']]['age'] = dct['age']

for dct in gender_dicts:
    main_dict[dct['name']]['gender'] = dct['gender']

编辑前案例的具体答案:

age_dict= {'name1':'age_value1', 'name2':'age_value2'}
gender_dict= {'name1':'gen_value1', 'name2':'gen_value2'}

如果您确定gender_dictage_dict为每个名称提供了值,那么就像

一样简单
for name, dct in main_dict.iteritems():
   dct['age'] = age_dict[name]
   dct['gender'] = gender_dict[name]

如果其他词典中没有条目的名称,您可以使用例外:

for name, dct in main_dict.iteritems():
   try:
       dct['age'] = age_dict[name]
   except KeyError:    # no such name in age_dict
       pass
   try:
       dct['gender'] = gender_dict[name]
   except KeyError:    # no such name in gender_dict
       pass

答案 1 :(得分:0)

dict的setdefault方法查找一个键,如果找到则返回该值。如果未找到,则返回默认值,并将该默认值分配给键。

super_dict = {}
for d in dicts:
    for k, v in d.iteritems():
        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():
        super_dict[k].append(v)

此外,正如Sven Marnach精明地观察到的那样,您似乎不想在列表中重复值。在这种情况下,设置可以获得你想要的东西:

import collections
super_dict = collections.defaultdict(set)
for d in dicts:
    for k, v in d.iteritems():
        super_dict[k].add(v)

答案 2 :(得分:0)

因此,您希望使用age_dictgender_dict来丰富main_dict中密钥的值。好吧,鉴于Python guarantees average dict lookup to be constant,您只受main_dict中密钥数量的约束,您可以在O(n)中达到丰富度,其中n是字典的大小:

for user_name, user_info in main_dict.items():
  if user_name in gender_dict:
    user_info['gender'] = gender_dict[user_name]
  if user_name in age_dic:
    user_info['age'] = age_dict[user_name]

这是一个奇特的功能,以通用方式执行此操作:

def enrich(target, **complements):
  for user_name, user_info in target.items():
    for complement_key, complemented_users in complements.items():
      if user_name in complemented_users:
        user_info[complement_key] = complemented_users[user_name]

enrich(main_dict, age=age_dict, gender=gender_dict)

即使您看到两个嵌套循环,main_dict中的用户数也更有可能超过补充字典的数量。