Самый эффективный / эффективный способ действия новых и старых предметов, сравнивающих два списка? - PullRequest
0 голосов
/ 23 апреля 2020

Мой вариант использования - у меня есть список вещей (скажем, оригинальные записи) и список обновленных вещей (обновленные записи). Для любых совершенно новых вещей в обновленном списке я хочу выполнить действие (скажем, отправить уведомление по электронной почте). Для любых вещей в исходном списке, которых больше нет в обновленном списке, я хочу выполнить другое действие (например, записать в журнал старую / устаревшую запись). Для любых вещей в исходном списке, которые также все еще находятся в обновленном списке, никаких действий не требуется. Равенство определяется стоимостью.

Подробно:

for updated_record in updated_records:
   if updated_record not it original_records:
      send_notification_email_for(updated_record)

for original_record in original_records:
   if original_record not in updated_records:
      log_outdated(original_record)

Мне кажется, что производственный код очень удобен для чтения:

removed_records = set(original_records).difference(updated_records)
new_records = set(updated_records).difference(original_records)
log_outdated(removed_records)
send_notification_email_for(new_records)

Обратите внимание на log_outdated и send_nofitication_email функциям также необходимо будет снова выполнить l oop через отфильтрованные коллекции selected_records и new_records.

Однако каждый список (исходный и обновленный) может содержать много тысяч записей, поэтому мне интересно, если У кого-нибудь есть предложения по более эффективным версиям того же лога c?

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете использовать наборы.

In [10]: originals = 'r1 r2 r3 r4'.split()

In [11]: originals
Out[11]: ['r1', 'r2', 'r3', 'r4']

In [12]: updated = 'r3 r4 r5 r6'.split()

In [13]: updated
Out[13]: ['r3', 'r4', 'r5', 'r6']

In [14]: for first_only in set(originals) - set(updated):
    ...:     print(first_only)
r1
r2

In [15]: for second_only in set(updated) - set(originals):
    ...:     print(second_only)
r5
r6

In [16]: for both in set(originals) & set(updated):
    ...:     print(both)
r4
r3

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