如何合并多个词典

2024-06-30 14:16:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有主语

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

我有另外两本字典,它们带来了更多的数据,需要添加到主字典中

就像

^{pr2}$

现在我想做一些循环并合并这些字典,以便 它检查相同的名字,从年龄和性别字典中获取值,并创建关键字“age”、“gender”并将它们添加到主字典中

现在我已经做到了,但我认为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']

编辑:修改年龄和性别


Tags: keyinforage字典valuemaingender
3条回答

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

super_dict = {}
for d in dicts:
    for k, v in d.iteritems():
        super_dict.setdefault(k, []).append(v)

您也可以考虑使用dict。这只是通过在找不到键时调用函数返回默认值来自动执行setdefault。在

^{pr2}$

另外,正如svenmarnach敏锐地观察到的,您似乎不希望列表中的值重复。在这种情况下,set可以得到您想要的:

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

一般提示:如果你在做

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

您很可能是做错了,因为您使用字典的目的不是很明确:通过元素的键访问元素。相反,做吧

^{pr2}$

如果不能确定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

所以您需要使用age_dictgender_dict来充实main_dict中键的值。好吧,给定Python guarantees average dict lookup to be constant你只受main_dict中的键的数量的限制,你可以达到O(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]

一个奇特的函数以一种通用的方式来实现:

^{pr2}$

即使您看到两个嵌套的循环,main_dict中的用户数很可能支配互补字典的数量。在

相关问题 更多 >