Как сравнить 2 json-списка разной длины? - PullRequest
0 голосов
/ 26 апреля 2019

Я получаю два JSON-ответа разной длины: «data» и «data_out».

Короткая часть "данных":

    "value":[
    {
    "A": "1112233"
    "B": "Abcdef"
    "C": "2019-04-26T10:00:00"
    "D": "http://aol.com/aaaa.mp3"
    "E": "880020030000"
    }
    ]

Тогда этот блок может повторяться в «данных» случайных времен. То же самое в «data_out», но есть другая дата / время.

Мне нужно сделать файл, где два JSON-списка будут отсортированы по дате и времени. Я делаю это с помощью "while".

index_3 = 0
index_out_3 = 0
while index_3 < len(data['value']):
    while index_out_3 < len(data_out['value']):
        time_in = (data['value'][index_3]['C'])
        time_out = (data_out['value'][index_out_3]['C'])

        if time_in < time_out:
            #<put all info from 'data' to xls-file>
            index_3 += 1
        else:
            #<put all info from 'data_out' to xls-file>
            index_out_3 += 1

Но у меня проблема в том, что «данные» заканчиваются раньше, чем «data_out». Иногда это так, но иногда «data_out» длиннее, чем «data», и у меня ошибка:

time_in = (data['value'][index_3]['start_time'])
IndexError: list index out of range

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Если data и data_out имеют аналогичную структуру (как в вашем примере), Вы можете связать оба списка вместе, а затем просто отсортировать по времени.

from itertools import chain

# chain lists together, e.g. chain([2, 1], [4, 3]) => iterable(2, 1, 4, 3)
result = chain(data["value"], data_out["value"])
result = sorted(result, key=lambda d: d["C"])
# <put all info from 'result' to xls-file>
0 голосов
/ 26 апреля 2019

https://github.com/xlwings/jsondiff слишком круто, и я сильно на это полагаюсь. Спасибо создателю этого пакета

Это чистый отрывок из кодовой страницы readme

из diff импорта jsondiff

diff ({'a': 1, 'b': 2}, {'b': 3, 'c': 4})

{'c': 4, 'b': 3, удалить: ['a']}

diff (['a', 'b', 'c'], ['a', 'b', 'c', 'd'])

{insert: [(3, 'd')]}

0 голосов
/ 26 апреля 2019

Я не думаю, что вам действительно нужны два цикла while, если вы собираетесь использовать две отдельные индексные переменные.

while index_3 < len(data['value']) and index_out_3 < len(data_out['value']):
    time_in = (data['value'][index_3]['C'])
    time_out = (data_out['value'][index_out_3]['C'])
    if time_in < time_out:
        <put all info from 'data' to xls-file>
        index_3 += 1
    else:
        <put all info from 'data_out' to xls-file>
        index_out_3 += 1

Это гарантирует, что ваш код завершится, если какой-либо из списков JSON достигнет своего конца,Если вы хотите выполнить дополнительную работу после выхода, рассмотрите другое условие внутри или вне цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...