繁体   English   中英

遍历嵌套的 python 字典

[英]Iterate through a nested python dict

我有一个看起来像这样的 JSON 文件:

{
    "returnCode": 200,
    "message": "OK",
    “people”: [
        {
            “details: {
                "first": “joe”,
                “last”: doe,
                “id”: 1234567,
            },
            “otheDetails”: {
                “employeeNum”: “0000111222”,
                “res”: “USA”,
                “address”: “123 main street”,
            },
            “moreDetails”: {
                “family”: “yes”,
                “siblings”: “no”,
                “home”: “USA”,
            },
        },
       {
            “details: {
                "first": “jane”,
                “last”: doe,
                “id”: 987654321,
            },
            “otheDetails”: {
                “employeeNum”: “222333444”,
                “res”: “UK”,
                “address”: “321 nottingham dr”,
            },
            “moreDetails”: {
                “family”: “yes”,
                “siblings”: “yes”,
                “home”: “UK,
            },
        }

这显示了两个条目,但实际上有数百个或更多。 我不知道代码运行时的条目数。

我的目标是遍历每个条目并在“详细信息”下获取“id”。 我将 JSON 加载到名为“data”的 python 字典中,并且能够通过以下方式获取第一个“id”:

data['people'][0]['details']['id']

然后我可以通过将“0”增加到“1”来获得第二个“id”。 我知道我可以设置 i = 0 然后增加 i,但由于我不知道条目的数量,这不起作用。 有没有更好的办法?

比列表推导式更少 Pythonic,但一个简单的 for 循环将在这里工作。

您可以先计算人员列表中的people ,然后遍历列表,在每次迭代中提取每个 id:

id_list = []

for i in range(len(data['people'])):
    current_id = data['people'][i]['details']['id']
    id_list.append(current_id)

您可以在列表推导中使用dict.get方法来避免在id上获得 KeyError 。 这样,您可以使用None填充没有id的字典:

ids = [dct['details'].get('id') for dct in data['people']]

如果您仍然得到 KeyError,那么这可能意味着data['people']中的某些dct没有details键。 在这种情况下,最好将此练习包含在try/except中。 您可能还想确定哪些dct没有details键,可以使用error_dct列表收集(您可以从下面取消注释)。

ids = []
#error_dct = []
for dct in data['people']:
    try:
        ids.append(dct['details']['id'])
    except KeyError:
        ids.append(None)
        #error_dct.append(dct)

Output:

1234567
987654321

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM