эквивалент того, что вы сейчас делаете, но наоборот, является:
unmatched_items_10 = [d for d in entries10 if d not in entries9]
В то время как более кратким, чем ваш способ кодирования его, это та же самая проблема производительности: это займет время пропорционально количеству элементов в каждом списке. Если длины, которые вас интересуют, составляют около 9 или 10 (как указывают эти цифры), никаких проблем.
Но для перечней существенной длины вы можете получить гораздо лучшую производительность, сортируя списки и «переходя их» параллельно «так сказать» (время пропорционально N log N
, где N
- это длина более длинного списка). Есть и другие возможности (растущего усложнения;), если даже этот более продвинутый подход недостаточен для того, чтобы получить требуемую производительность. Я воздержусь от предложения очень сложных вещей, если вы не укажете, что вы требуете, чтобы он получил хорошую производительность (в этом случае, пожалуйста, укажите типичные длины каждого списка и типичного содержимого диктонов, являющихся их товарами, начиная с Конечно, такими «деталями» являются решающее значение для выбора алгоритмов, которые являются хорошим компромиссом между скоростью и простотой).
Edit: ОП редактировать его Q, чтобы показать, что он заботится о, для любых двух dicts d1
и d2
один каждый из двух списков, не является ли d1 == d2
(что то, что in
оператор проверяет), а d1[a]==d2[a] and d1[b]==d2[b]
. В этом случае оператор in
не может быть использован (ну, не без фанки упаковки, но это осложнение, что лучше всего избегать, когда это возможно ;-), но all
встроенных заменяет его сподручно:
unmatched_items_10 = [d for d in entries10
if all(d[a]!=d1[a] or d[b]!=d2[b] for d2 in entries9)]
Я переключил логика вокруг (до !=
и or
, за De Morgan's laws), так как мы хотим, чтобы dicts не соответствовали. Однако, если вы предпочитаете:
unmatched_items_10 = [d for d in entries10
if not any(d[a]==d1[a] and d[b]==d2[b] for d2 in entries9)]
Лично мне не нравится if not any
и if not all
, по стилистическим причинам, но математика безупречна (на то, что на странице Википедии называет Extensions к законам де Моргана, поскольку any
является квантор существования и all
универсальный квантификатор, так сказать ;-). Производительность должна быть примерно эквивалентной (но тогда ОП пояснил в комментарии, что производительность для них не очень важна).
Я думаю, что вы можете заменить 'if match_found: continue' на' if match_found: break' (в конце) во внутреннем цикле. – SiggyF
Хорошая точка @SiggyF! Да, я могу. – AP257