【问题标题】:How to merge dictionaries according to key, inside of loop如何在循环内部根据键合并字典
【发布时间】:2019-04-16 15:51:29
【问题描述】:

所以我有一个嵌套字典列表,我想创建一个字典。 几天前我遇到了类似的问题,我认为解决方案非常相似,但我似乎无法掌握它。

这是原始列​​表:

list = [{'user': 'nikos', 'area': 'Africa', 'keywords': 'Kenya$Egypt'},
{'user': 'nikos', 'area': 'Europe', 'keywords': 'Brexit'},
{'user': 'maria', 'area': 'US & Canada', 'keywords': 'New York'},
{'user': 'maria', 'area': 'Latin America ', 'keywords': 'Brazil'}]

我想创建这样的字典:

dictionary = {'user': 'nikos', 'areas': {'Africa': ['Kenya', 
'Egypt'],'Europe': ['Brexit']}

1) 我已经设法创建了这些:

{'user': 'nikos', 'areas': {'Africa': ['Kenya', 'Egypt']}}
{'user': 'nikos', 'areas': {'Europe': ['Brexit']}}

但我不能越过这一点并在我的循环中合并到一个字典中(根据我的尝试,我得到了各种错误)

2) 我也尝试过这样的字典理解:

dict_1 = {'user': username, 'areas': {new_profile.get('areas') for x in 
new_profs}}

这当然是不正确的,但我想知道我是否接近正确的人

username = 'nikos'

user = {}

for i in list:
  if i['user'] == username: 
    new_profile = {'user': username, 'areas': {i['area']: i['keywords'].split('$')}}
    if new_profile:
        new_profs = []
        new_profs.append(new_profile)

【问题讨论】:

  • 你说你想要一个结果字典,比如: dictionary = {'user': 'nikos', ....} 但是你不能为同一个键有不同值的字典。所以它要么是一个字典列表,要么使用名称作为键。

标签: python dictionary-comprehension


【解决方案1】:

你走在正确的道路上。基本上,一旦您获得new_profs,您就需要单独处理合并。像这样的:

userlist = [{'user': 'nikos', 'area': 'Africa', 'keywords': 'Kenya$Egypt'},
{'user': 'nikos', 'area': 'Europe', 'keywords': 'Brexit'},
{'user': 'maria', 'area': 'US & Canada', 'keywords': 'New York'},
{'user': 'maria', 'area': 'Latin America ', 'keywords': 'Brazil'}]

username = 'nikos'

user = {}
new_profs = []

for i in userlist:
  if i['user'] == username:
    new_profile = {'user': username, 'areas': {i['area']: i['keywords'].split('$')}}
    if new_profile:
        new_profs.append(new_profile)

print new_profs
'''will give you 
[{'user': 'nikos', 'areas': {'Africa': ['Kenya', 'Egypt']}}, {'user': 'nikos', 'areas': {'Europe': ['Brexit']}}]'''

#get all unique users
userset = set([x['user'] for x in new_profs])

merged_profs = []


#for each unique user, go through all the new_profs and merge all of them into one dict
for user in userset:
    merged_dict = {}
    for userprof in new_profs:
        if userprof['user'] == user:
            if merged_dict:
                new_areas = merged_dict.get('areas')
                # you might need to tweak this for your needs. For example, if you want all Europe countries
                # in one dict. Better pull this out into method and add logic accordingly
                new_areas.update(userprof['areas'])
                merged_dict['areas'] = new_areas
            else:
                merged_dict.update(userprof)
    merged_profs.append(merged_dict)

print merged_profs
#gives you [{'user': 'nikos', 'areas': {'Europe': ['Brexit'], 'Africa': ['Kenya', 'Egypt']}}]

【讨论】:

    【解决方案2】:

    我会这样做:

    #!/usr/bin/python3
    l = [
         {'user': 'nikos', 'area': 'Africa', 'keywords': 'Kenya$Egypt'},
         {'user': 'nikos', 'area': 'Europe', 'keywords': 'Brexit'},
         {'user': 'maria', 'area': 'US & Canada', 'keywords': 'New York'},
         {'user': 'maria', 'area': 'Latin America ', 'keywords': 'Brazil'}
        ]
    
    # The end result
    result = list()
    
    # First extract the names from the dict and put them in
    # a set() to remove duplicates.
    for name in set([x["user"] for x in l]):
    
        # define the types that hold your results
        user_dict = dict()
        area_dict = dict()
        keyword_list = list()
    
        for item in l:
    
           if item["user"] == name:
    
                # Get the keywords for a given entry in "l"
                # and place them in a dictionary with the area keyword from "l"
                keyword_list = item["keywords"].split("$")
                area_dict[item["area"]] = keyword_list
    
        # Pack it all together in the result list.
        user_dict["name"] = name
        user_dict["areas"] = area_dict
        result.append(user_dict)
    

    这给出了:

    [
       {'name': 'maria', 'areas': {'US & Canada': ['New York'], 'Latin America ': ['Brazil']}},
       {'name': 'nikos', 'areas': {'Africa': ['Kenya', 'Egypt'], 'Europe': ['Brexit']}}
    ]
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2016-02-22
      • 2018-11-15
      • 2018-12-01
      • 2021-01-26
      • 1970-01-01
      • 2022-11-28
      • 2019-11-23
      • 2020-05-14
      相关资源
      最近更新 更多