Python 嵌套列表/字典和弹出值

6

提前道歉,这是一个非常新手的问题。我刚开始学习Python,并且在弹出嵌套字典/列表中的值方面一直感到困惑,因此非常感谢任何帮助!

我有这个样本JSON数据:

{ "scans": [
   { "status": "completed", "starttime": "20150803T000000", "id":533},
   { "status": "completed", "starttime": "20150803T000000", "id":539}
] }

我希望您能将“id”从“scans”键中取出。
def listscans():
  response = requests.get(scansurl + "scans", headers=headers, verify=False)
  json_data = json.loads(response.text)
  print json.dumps(json_data['scans']['id'], indent=2)

似乎无法工作,因为嵌套的键/值对在列表中。即

>>> print json.dumps(json_data['scans']['id'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str

有人能指导我如何让这个工作起来吗?我的长期目标是创建一个for循环,将所有的id放入另一个字典或列表中,以便我可以在另一个函数中使用。

从你最后的评论中看来,你已经对需要做什么有了很好的想法。为什么不试着编写代码并展示给我们看看你的尝试呢? - loopbackbee
我想不在这个帖子里发布一百万个失败的尝试示例,以便将来有类似问题的读者能够简明地了解情况。 - dobbs
2个回答

4

json_data['scans'] 返回一个字典列表,您正在尝试使用字符串进行索引,即 []["id"],显然会导致失败,因此您需要使用索引来获取每个子元素:

print json_data['scans'][0]['id'] # -> first dict
print json_data['scans'][1]['id'] # -> second dict

或者通过迭代使用json_data ["scans"]返回的字典列表中的所有id:

for dct in json_data["scans"]:
    print(dct["id"]) 

要将内容追加到列表中:

all_ids = []
for dct in json_data["scans"]:
    all_ids.append(dct["id"])

或者使用列表推导式:

all_ids = [dct["id"] for dct in json_data["scans"]]

如果有可能某些字典中没有键id,在访问之前使用in进行检查:

all_ids = [dct["id"] for dct in json_data["scans"] if "id" in dct]

太好了!我在['scans']之后缺少了列表索引位置。现在有意义了。不过第二个例子让我有点困惑。print(d["id"])中的d是索引位置吗?我以为你必须将索引位置放在方括号内才能弹出值。 - dobbs
@dobbs,我们正在循环遍历列表,因此每个“d”都是列表中的实际“元素/字典”,因此我们通过键“id”访问字典以获取每个值。 - Padraic Cunningham

0

以下是如何迭代所有项并提取所有 ID 的方法:

json_data = ...
ids = []
for scan in json_data['scans']:
    id = scan.pop('id')
    # you can use get instead of pop
    # then your initial data would not be changed, 
    # but you'll still have the ids
    # id = scan.get('id')
    ids.append();

这种方法也可以起作用:

ids = [item.pop('id') for item in json_data['scans']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接