Ваш первый список выглядит как справочная таблица. Я думаю, что самый быстрый способ сделать это преобразование - преобразовать list1 в dict, а затем выполнить поиск для преобразования list2 в list3:
dict1 = dict(list1)
list3 = [[(item, dict1[item]) for item in sublist] for sublist in list2]
# output: [[(200, 'c'), (0, 'a')], [(300, 'd'), (100, 'b')]]
Python dicts имеют конструктор, который принимает список пар, просто как ваш list1
. Это превращает list1
в таблицу быстрого поиска dict1
. Затем вы перебираете свои подсписки, затем перебираете элементы в каждом подсписке и выполняете этот поиск.
Я не помню эффективности конструктора Python dict, но он не хуже O(n log(n))
.
Всякий раз, когда у вас есть список пар, иногда стоит подумать, не будет ли проще использовать его как диктант. Python любит dicts.
EDIT: обратите внимание, что dicts может хранить только одно значение на ключ. Первоначально я думал, что это нормально, но было разъяснено, что это не так.
Следующее решение - преобразовать его в мульти-карту, а затем уничтожить его как go. Multimap похожа на dict, но в ней хранится список всех значений, имеющих ключ - это не ограничивается одним значением для каждого ключа. Очевидно, поскольку нам не нужен весь список, нам нужно только одно уникальное значение для каждого экземпляра, мы возьмем последнее значение из списка с карты. Код будет выглядеть очень похоже, но построение мульти-карты будет отличаться от построения dict.
Я приведу здесь более полный пример, чтобы продемонстрировать.
from collections import defaultdict
def impose_structure (list1, list2):
# This multimap will be a map from the key to a list of all values of that key,
# like {0: ['a', 'b', 'c', 'd']}
multimap = defaultdict (list)
for key, value in list1:
multimap[key].append (value)
# We'll do the same thing as before, but now we'll remove values from the end
# so we don't have duplicates
return [[(item, multimap[item].pop ()) for item in sublist] for sublist in list2]
if __name__ == '__main__':
list1 = [(0, 'a'), (0, 'b'), (100, 'c'), (100, 'd')]
list2 = [[100, 0], [0, 100]]
print (impose_structure (list1, list2))
# outputs: [[(100, 'd'), (0, 'b')], [(0, 'a'), (100, 'c')]]