[英]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.