2012-04-30 10 views
6

Dla dwóch list,lista mecz w Pythonie: uzyskać indeksy sub-listy w większej liście

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) 

jak pozwolić get_indices_of_a zwrot indices = [0, 2, 0,...] z array(a)[indices] = b? Czy istnieje szybsza metoda niż użycie a.index, która trwa zbyt długo?

Making b zestaw to szybka metoda dopasowywania list i powrocie indeksów (patrz compare two lists in python and return indices of matched values), ale straci indeksu drugiego 1 jak również kolejność indeksów w tej sprawie.

Odpowiedz

12

Szybka metoda (gdy a jest duża lista) będzie przy użyciu dict do mapowania wartości a do indeksów:

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

To zajmie trochę czasu liniowego w przeciętnej sytuacji w porównaniu z wykorzystaniem a.index który wymagałoby czasu kwadratowego.

+0

+1. Jest to dobra odpowiedź dla dużych list, gdzie drastycznie skróci to czas - naturalnie na małych listach stworzenie dyktatu zajmie więcej czasu, niż pozwoli zaoszczędzić. Biorąc pod uwagę komentarz pytającego o moją odpowiedź, wydaje mi się, że chodzi o duże listy, więc jest to pożądana odpowiedź. –

7

Zakładając, że pracujemy z mniejszych list, to jest tak proste, jak:

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

Na większych list, to będzie bardzo kosztowne.

(Jeśli występują duplikaty, pierwsze wystąpienie będzie zawsze występowało na liście wynikowej, jeśli not set(b) <= set(a), otrzymasz błąd ValueError).

+0

Wielkie dzięki! Nie ma duplikatów, ale jest bardzo duży, a b nie jest mały, chociaż len (b) << len (a). Użycie a.index (element) wykonuje wyszukiwanie w dla każdej wartości w b ... czy istnieje szybsza metoda? – user1342516

+0

@ user1342516 Yup, patrz [odpowiedź interjay] (http://stackoverflow.com/a/10385786/722121). –

+0

możesz dodać to do swojego rozwiązania, aby usunąć sytuację ValueError: [a.index (pozycja) dla pozycji w b, jeśli pozycja jest w] –

Powiązane problemy