Вопрос: Оптимизация списка поиска


first = [(1, text, text, 1, 2, 3), 
         (1, text, text, 1, 0, 3), ... (6054, text, text, 2, 2, 3)]
second = (1, 2, 3, 4, 5 ... 5412)

Есть ли более быстрый способ сделать это:

data = [x for x in first if x[0] in second]

4


источник


Ответы:


Попробуй это:

first = [(1, text, text, 1, 2, 3), 
         (1, text, text, 1, 0, 3), ... (1054, text, text, 2, 2, 3)]
second = (1, 2, 3, 4, 5 ... 5412)
second_set = set(second)
data = [x for x in first if x[0] in second_set]

Предположим, что сначала имеет m элементов, а второе имеет n элементов.

Наборы хэшируются, поэтому их поиск близок к O (1), что дает общую эффективность O (m). Поиск второго в качестве списка - это O (n), обеспечивающий общую эффективность O (m * n).


5



Может быть, вы хотите именно это, а не in проверить:

data = [x for x in first if 1 <= x[0] <= 5412 ]

1