совпадение списка в 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).