【问题标题】:Traversing through dict and list in python在python中遍历dict和list
【发布时间】:2019-07-28 13:24:14
【问题描述】:

所以我从一个包含字典和多个列表的 API 中提取 JSON 格式的数据。

result=r.json()
i=0
x=0

for row in r:
    print('Driver ID: ', result['logs'][x]['log']['driver']['username'])
    print('First Name: ', result['logs'][x]['log']['driver']['first_name'])
    print('Last Name: ', result['logs'][x]['log']['driver']['last_name'])
    for row1 in r:
        print('ID: ', result['logs'][x]['log']['events'][i]['event']['id'])
        print('Start Time: ', result['logs'][x]['log']['events'][i]['event']['start_time'])
        print('Type: ', result['logs'][x]['log']['events'][i]['event']['type'])
        print('Location: ', result['logs'][x]['log']['events'][i]['event']['location'])
        i=i+1
    x=x+1

我得到的错误是

print('ID: ', result['logs'][x]['log']['events'][i]['event']['id'])
IndexError: list index out of range

我知道变量 i 加起来到该索引处没有对象的点,问题是“事件”键在每个列表中都有可变数量的事件。例如,第一个驱动程序的日志可能有 7 个事件,而下一个驱动程序只能有 3 个事件。有没有办法可以根据事件中存在的索引数运行循环?

我也尝试使用带有“result”而不是“r”的循环,但我对 Python 还很陌生,我得到的结果不正确。

这是 API 文档的链接。我要定位的端点是 /logs。 https://developer.keeptruckin.com/reference#get-logs

【问题讨论】:

  • 在这种情况下,我会使用一个工具来解压 json,首先向我展示数据结构。看看来自 Pandas 的json_normalize

标签: python json python-3.x rest api


【解决方案1】:

您应该遍历子列表而不是根级别的 result dict,并避免使用索引:

result = r.json()

for log in result['logs']:
    print('Driver ID: ', log['log']['driver']['username'])
    print('First Name: ', log['log']['driver']['first_name'])
    print('Last Name: ', log['log']['driver']['last_name'])
    for event in log['log']['events']:
        print('ID: ', event['event']['id'])
        print('Start Time: ', event['event']['start_time'])
        print('Type: ', event['event']['type'])
        print('Location: ', event['event']['location'])

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2012-01-28
    • 2018-11-29
    • 1970-01-01
    • 2012-08-20
    • 2019-04-24
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多