В списке dicts обновите значение для одного элемента, который соответствует условию - без повторения - PullRequest
0 голосов
/ 07 мая 2020

У меня есть список (назовем его list_1), который исходит из электронной таблицы, которая в значительной степени основана на массивах / индексах, и я пытаюсь сравнить его с другим списком (list_2) объектов из ответа API.

Стоит отметить, что, поскольку Sheets - это многомерная матрица, каждая строка содержит массив столбцов (например, от row[0] до row[5] для листа с 6 столбцами).

Чтобы убедиться, что все данные совпадают, когда я выполняю итерацию через list_1 (выполняя некоторые другие функции), мне затем нужно найти соответствующий объект в list_2 и обновить его с помощью диапазон электронной таблицы.

Я уже повторяю строки электронной таблицы (list_1), и единственный способ сделать это - повторять list_2 каждый l oop. Это довольно дорого:

for row in list_1:
    # Do some things with the row, then:
    for post in list_2:
        if post.id == row[0]:
             setattr(post, 'range', f'A{i+2}:F{i+2}')

Я могу написать это с помощью выражения генератора, но (я полагаю?) Это все еще повторяется и все еще дорого?

for row in list_1:
    # Do some things with the row, then:
    setattr(list_2[next(i for i,v in enumerate(posts) if v.id == row[0])], 'range', f'A{i+2}:F{i+2}')

Есть ли способ обновить объект в массиве, найдя его значение, которое более эффективно, чем итерация по всему списку , или использование выражения генератора? Для элегантности было бы здорово, если бы я мог сделать это одной строкой, но нищие не могут выбирать.

Если это невозможно, укажите это в своем ответе для полноты.

1 Ответ

1 голос
/ 07 мая 2020

Вы можете преобразовать list2 в словарь, который содержит post.id как ключи и post как значение:

list2_dict = {p.id:p for p in list2}

, и тогда вам не нужно будет перебирать его:

setattr(list2_dict[row[0]], 'range', f'A{i+2}:F{i+2}')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...