совпадение списка в python: получить индексы вложенного списка в большем списке

для двух списков,

a = [1, 2, 9, 3, 8, ...]   (no duplicate values in a, but a is very big)
b = [1, 9, 1,...]          (set(b) is a subset of set(a), 1<<len(b)<<len(a)) 

indices = get_indices_of_a(a, b)

как сделать get_indices_of_a return indices = [0, 2, 0,...] С array(a)[indices] = b? Есть ли более быстрый метод, чем использование a.index, что занимает слишком много времени?

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

2 ответов


быстрый метод (когда a - большой список) будет использовать dict для отображения значений в a показатели:

>>> index_dict = dict((value, idx) for idx,value in enumerate(a))
>>> [index_dict[x] for x in b]
[0, 2, 0]

это займет линейное время в среднем случае, по сравнению с использованием a.index что займет квадратичное время.


предполагая, что мы работаем с небольшими списками, это так же просто, как:

>>> a = [1, 2, 9, 3, 8] 
>>> b = [1, 9, 1] 
>>> [a.index(item) for item in b]
[0, 2, 0]

в больших списках это станет довольно дорогим.

(Если есть дубликаты, первое вхождение всегда будет тем, на которое ссылаются в результирующем списке, если not set(b) <= set(a), вы получите ValueError).