Прохождение через dict и list в python

#python #json #python-3.x #rest #api

#python #json #python-3.x #остальное #API

Вопрос:

Итак, я извлекаю данные в JSON из API, в котором есть dicts и несколько списков.

 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 суммируется до точки, где нет объекта с этим индексом, проблема в том, что ключ ‘events’ имеет переменное количество событий в каждом списке. Например, журнал для первого драйвера может содержать 7 событий, а у следующего драйвера может быть только 3 события. Есть ли способ, которым я могу запустить цикл на основе количества индексов, которые существуют в событиях?

Я также пытался использовать цикл с ‘result’ вместо ‘r’, но я довольно новичок в Python, и результаты, которые я получал с этим, были неверными.

Вот ссылка на документ API. Конечная точка, на которую я ориентируюсь, — это / logs. https://developer.keeptruckin.com/reference#get-logs

Комментарии:

1. В подобных случаях я бы использовал инструмент, который распаковывает json, чтобы сначала показать мне структуру данных. Взгляните на json_normalize из Pandas.

Ответ №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'])