首页 > 解决方案 > 如何从列表中的嵌套字典对象中提取选定的键和值?

问题描述

我有一个example_list包含两个 dict 对象的列表,它看起来像这样:

[
        {
            "Meta": {
                "ID": "1234567",
                "XXX": "XXX"
            },
            "bbb": {
                "ccc": {
                    "ddd": {
                        "eee": {
                            "fff": {
                                "xxxxxx": "xxxxx"
                            },
                            "www": [
                                {
                                    "categories": {
                                        "ppp": [
                                            {
                                                "content": {
                                                    "name": "apple",
                                                    "price": "0.111"
                                                },
                                                "xxx: "xxx"
                                            }
                                        ]
                                    },
                                    "date": "A2020-01-01"
                               }
                            ]
                        }
                    }
                }
            }
        },
        {
            "Meta": {
                "ID": "78945612",
                "XXX": "XXX"
            },
            "bbb": {
                "ccc": {
                    "ddd": {
                        "eee": {
                            "fff": {
                                "xxxxxx": "xxxxx"
                            },
                            "www": [
                                {
                                    "categories": {
                                        "ppp": [
                                            {
                                                "content": {
                                                    "name": "banana",
                                                    "price": "12.599"
                                                },
                                                "xxx: "xxx"
                                            }
                                        ]
                                    },
                                    "date": "A2020-01-01"
                               }
                            ]
                        }
                    }
                }
            }
        }
    ]

现在我想过滤项目,只保留"ID": "xxx"和对应的值"price": "0.111",预期结果可能类似于:

[{"ID": "1234567", "price": "0.111"}, {"ID": "78945612", "price": "12.599"}] 或类似的东西{"1234567":"0.111", "78945612":"12.599" }

这是我尝试过的:

map_list=[]
map_dict={}
for item in example_list:
   #get 'ID' for each item in 'meta'
   map_dict['ID'] = item['meta']['ID']
   
   # get 'price'
   data_list = item['bbb']['ccc']['ddd']['www']
   for data in data_list:
      for dataitem in data['categories']['ppp']
         map_dict['price'] = item["content"]["price"]
         map_list.append(map_dict)

print(map_list)

结果看起来不正确,感觉项目没有正确迭代,它给了我结果:

[{"ID": "78945612", "price": "12.599"}, {"ID": "78945612", "price": "12.599"}]

它给了我第二个 ID 的重复结果,但第一个 ID 在哪里?有人可以帮我看看吗,谢谢。

更新:从另一个问题的一些评论中,我了解输出一直被覆盖的原因是因为其中的键名dict始终相同,但我不知道如何解决这个问题,因为需要提取键和值来自不同级别的 for 循环,任何帮助将不胜感激,谢谢。

标签: python-3.xlistdictionary

解决方案


map_dict正如@Scott Hunter 所提到的,每次尝试执行此操作时都需要创建一个新的。这是您解决方案的快速修复(遗憾的是,我现在无法对其进行测试,但对我来说似乎是正确的)。

map_list=[]
for item in example_list:
   # get 'price'
   data_list = item['bbb']['ccc']['ddd']['www']
   for data in data_list:
      for dataitem in data['categories']['ppp']:
         map_dict={}
         map_dict['ID'] = item['meta']['ID']
         map_dict['price'] = item["content"]["price"]
         map_list.append(map_dict)

print(map_list)

但是你在这里做的是你基本上只是“强迫”你通过......我建议你休息一下并查看某种教程,这将帮助你了解它在后端的真正工作原理. 这就是我写它的方式:

list_dicts = []
for example in example_list:
    for www in item['bbb']['ccc']['ddd']['www']:
        for www_item in www:
            list_dicts.append({
                     'ID': item['meta']['ID'], 
                     'price': www_item["content"]["price"]
            })

祝你好运,希望对你有帮助:)


推荐阅读