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

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

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

杨魅力 2022-01-11 19:57:50
所以我有一个嵌套字典列表,我想创建一个字典。几天前我遇到了类似的问题,我认为解决方案非常相似,但我似乎无法掌握它。这是原始列表: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)
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

你走在正确的道路上。基本上一旦你得到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']}}]



查看完整回答
反对 回复 2022-01-11
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

我会这样做:


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

]


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

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