如何在循环内根据键合并字典

时间:2019-04-16 15:51:29

标签: python dictionary-comprehension

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

这是原始列​​表:

private

我想创建这样的字典:

List

1)我设法创建了这些:

getTabIterator

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

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

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']}

2 个答案:

答案 0 :(得分:0)

您在正确的道路上。本质上,一旦您获得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']}}]

答案 1 :(得分:0)

我会这样:

#!/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']}}
]