【问题标题】:Creating new dictionary from old dictionary从旧词典创建新词典
【发布时间】:2019-12-23 12:51:11
【问题描述】:

我正在尝试从旧字典创建一个新字典,以仅获取我将来在 df 中新增的值。但是我创建的函数总是返回相同的键+值。

def load_data():

    with open('./data/awards.json', 'r') as file:
        json_file = json.load(file)        

    events_dict = {}

    for data_raw in json_file:
        events_dict['event'] = (data_raw['Event'])

        #form categories_list
        categories_list = []
        for all_data in data_raw['Data']:
            for awards_data in all_data['nomineesWidgetModel']['eventEditionSummary']['awards']:

                #check if it's a premium category
                if categories_data['isPremiumCategory'] == True:
                    for categories_data in awards_data['categories']:
                        categories = {}
                        categories['category_name'] = (categories_data['categoryName'])

                        #form nomination_list
                        nomination_list = []
                        for nominations_data in categories_data['nominations']:

                            primary_nominees = nominations_data['primaryNominees']
                            if len(primary_nominees)>0:
                                nominee1 = primary_nominees[0]['name']

                            secondary_nominees = nominations_data['secondaryNominees']
                            if len(secondary_nominees)>0:
                                nominee2 = secondary_nominees[0]['name']

                            nomination_list.append([nominee1, nominee2, nominations_data['isWinner']])

                        categories['nominations'] = nomination_list                    
                        categories_list.append(categories)
                    events_dict['categories'] = categories_list

    return events_dict

我的目的是获得每个奖项的类别、提名以及是否获奖。我现在得到的是同一个事件的 11 倍。

我尝试更改缩进,先将 dict 附加到列表中,但没有任何帮助...我确信这是非常基本的东西,但我是 Python 新手,没有看到我的错误。

json file

有可能做这样的事情吗?

【问题讨论】:

  • 您可以添加原始数据的 sn-p 吗?
  • events_dict['event'] = (data_raw['Event']) 将在每次迭代时覆盖。您还需要在这里切换一些逻辑:if categories_data['isPremiumCategory'] == True: 应该在 for categories_data in awards_data['categories']: 之后

标签: python json loops dictionary


【解决方案1】:

你的逻辑有点不对劲。你想在你的循环中初始化你的events_dict = {},然后你可以将它附加到一个列表中,我将它命名为results

def load_data():

    with open('C:/test/awards.json', 'r') as file:
        json_file = json.load(file)        


    results = []  #<---- initialize result list
    for data_raw in json_file:
        events_dict = {} #<--- here initialize your dictionary then build it
        events_dict['event'] = data_raw['Event']

        #form categories_list
        categories_list = []
        for all_data in data_raw['Data']:
            for awards_data in all_data['nomineesWidgetModel']['eventEditionSummary']['awards']:

                #check if it's a premium category
                for categories_data in awards_data['categories']:    #<---- Need to switch this line
                    if categories_data['isPremiumCategory'] == True:  #<---This needs to follow your loop
                        categories = {}
                        categories['category_name'] = (categories_data['categoryName'])

                        #form nomination_list
                        nomination_list = []
                        for nominations_data in categories_data['nominations']:

                            primary_nominees = nominations_data['primaryNominees']
                            if len(primary_nominees)>0:
                                nominee1 = primary_nominees[0]['name']
                            else:
                                nominee1 = ''


                            secondary_nominees = nominations_data['secondaryNominees']
                            if len(secondary_nominees)>0:
                                nominee2 = secondary_nominees[0]['name']
                            else:
                                nominee2 = ''


                            nomination_list.append([nominee1, nominee2, nominations_data['isWinner']])

                        categories['nominations'] = nomination_list                    
                        categories_list.append(categories)
                        events_dict['categories'] = categories_list
            results.append(events_dict) #<---- once that dictionary is filled, you can append it into that result list, then move on to make a new events_dict with the next iteration

    return results

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多