Вот подход, который может помочь.Я оставлю это вам, чтобы заполнить детали.
Ваш код работает медленно, потому что это алгоритм O (n ^ 2), сравнивающий каждое A с каждым B.
Если высначала отсортируйте каждую из операций listA и listB по идентификатору (это O (nlogn)), затем вы можете легко перебирать отсортированные версии A и B (это будет за линейное время).
Этот подходобычно, когда вам приходится выполнять внешние слияния с очень большими наборами данных.Ответ Михая лучше для внутреннего слияния, когда вы просто индексируете все по id (в памяти).Если у вас есть память для хранения этих дополнительных структур, а поиск по словарю является постоянным временем, такой подход, скорее всего, будет быстрее, не говоря уже о более простом.:)
В качестве примера, скажем, у A были следующие идентификаторы после сортировки
acfgjp
, а у B были эти идентификаторы, снова после сортировки
aaaabbbbcccddeeeefffggiikknnnnppppqqqrrr
Идея, как ни странно, состоит в том, чтобы сохранить индексы для A и B (я знаю, что это звучит не очень Pythonic).Сначала вы смотрите на a
в A и a
в B. Таким образом, вы проходите через B, добавляя все a к вашему массиву вещей для a
.Как только вы исчерпали a в B, вы переместитесь на один вверх в A, до c
.Но следующий элемент в B - b
, который меньше c
, поэтому вам нужно пропустить b.Затем вы получите c
в B, так что вы можете начать добавлять в «вещи» для c.Продолжайте в том же духе, пока оба списка не будут исчерпаны.Всего один проход.:)