Манипулирование данными двух списков словарей - PullRequest
0 голосов
/ 17 января 2020

У меня есть два следующих списка:

retrieved_sessions = [
    {'start_time': '2020-01-17T08:30:00.000Z', 'availability': '5'}, 
    {'start_time': '2020-01-17T09:30:00.000Z', 'availability': '7'}, 
    {'start_time': '2020-01-17T10:30:00.000Z', 'availability': '6'}, 
    {'start_time': '2020-01-17T11:30:00.000Z', 'availability': '5'}, 
    {'start_time': '2020-01-17T12:30:00.000Z', 'availability': '0'}, 
    {'start_time': '2020-01-17T13:30:00.000Z', 'availability': '2'}, 
    {'start_time': '2020-01-17T14:30:00.000Z', 'availability': '13'}
]
all_sessions = [
    {'start_time': '2020-01-17T09:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T09:30:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T10:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T10:30:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T11:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T11:30:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T12:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T12:30:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T13:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T13:30:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T14:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T14:30:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T15:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T15:30:00.000Z', 'availability': None}
]

Мне было интересно, как лучше всего обновить словарь в all_sessions с помощью availability из соответствующего * 1007? * dictinary, используя start_time в качестве поля поиска / сопоставления первичного ключа?

Ожидаемый результат:

all_sessions = [
    {'start_time': '2020-01-17T09:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T09:30:00.000Z', 'availability': '7'}, 
    {'start_time': '2020-01-17T10:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T10:30:00.000Z', 'availability': '6'}, 
    {'start_time': '2020-01-17T11:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T11:30:00.000Z', 'availability': '5'}, 
    {'start_time': '2020-01-17T12:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T12:30:00.000Z', 'availability': '0'}, 
    {'start_time': '2020-01-17T13:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T13:30:00.000Z', 'availability': '2'}, 
    {'start_time': '2020-01-17T14:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T14:30:00.000Z', 'availability': '13'}, 
    {'start_time': '2020-01-17T15:00:00.000Z', 'availability': None}, 
    {'start_time': '2020-01-17T15:30:00.000Z', 'availability': None}
]

Я пробовал следующее l oop в пределах oop:

for available in availability:
    for session in sessions:
        if session['start_time'] == available['start_time']:
            session['availability'] = available['availability']

Примечание. Данные поступают из SOAP API, поэтому вместо wierd '1' / '2', например, 1, 2. и др c

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Вы можете указать помощнику, где ключ start_time и значение availability, а затем заменить соответствующие значения в all_sessions

d = {s['start_time']: s['availability'] for s in retrieved_sessions}

for s in all_sessions:
    s['availability'] = d.get(s['start_time'])

from pprint import pprint
pprint(all_sessions)

Отпечатки:

[{'availability': None, 'start_time': '2020-01-17T09:00:00.000Z'},
 {'availability': '7', 'start_time': '2020-01-17T09:30:00.000Z'},
 {'availability': None, 'start_time': '2020-01-17T10:00:00.000Z'},
 {'availability': '6', 'start_time': '2020-01-17T10:30:00.000Z'},
 {'availability': None, 'start_time': '2020-01-17T11:00:00.000Z'},
 {'availability': '5', 'start_time': '2020-01-17T11:30:00.000Z'},
 {'availability': None, 'start_time': '2020-01-17T12:00:00.000Z'},
 {'availability': '0', 'start_time': '2020-01-17T12:30:00.000Z'},
 {'availability': None, 'start_time': '2020-01-17T13:00:00.000Z'},
 {'availability': '2', 'start_time': '2020-01-17T13:30:00.000Z'},
 {'availability': None, 'start_time': '2020-01-17T14:00:00.000Z'},
 {'availability': '13', 'start_time': '2020-01-17T14:30:00.000Z'},
 {'availability': None, 'start_time': '2020-01-17T15:00:00.000Z'},
 {'availability': None, 'start_time': '2020-01-17T15:30:00.000Z'}]
1 голос
/ 17 января 2020

Создайте новый dict с начальным временем в качестве ключей и доступностью в качестве значений.

Затем выполните итерации по copy.deepcopy (all_sessions) .items (), сопоставив по start_time и добавив к исходным all_sessions как вы go , Глубокая копия объясняется тем, что вы не можете перебрать диктовку и изменить ее за один проход.

В вашем примере два вложенных цикла for - O (n * m) - IOW, это медленно. Внедрение dict таким образом ускорит процесс до O (n + m).

Обратите внимание, что при вводе времени может возникать проблема, связанная с дублированием времени.

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