2012-04-28 8 views
10

Per due elenchi aeb, come posso ottenere gli indici di valori che appaiono in entrambi? Ad esempio,confronta due liste in python e restituisce indici di valori corrispondenti

a = [1, 2, 3, 4, 5] 
b = [9, 7, 6, 5, 1, 0] 

return_indices_of_a(a, b) 

sarebbero tornati [0,4], con (a[0],a[4]) = (1,5).

+0

possibile duplicato di [Python: come trovare l'intersezione dell'elenco?] (Http://stackoverflow.com/questions/3697432/python-how-to-find-list-intersection) – ChristopheD

+2

Non penso che questa domanda sia un duplicato di quello anche se potrebbe essere simile. – jamylak

risposta

18

Il modo migliore per farlo sarebbe quello di rendere b un set poiché si sta verificando solo l'appartenenza al suo interno.

>>> a = [1, 2, 3, 4, 5] 
>>> b = set([9, 7, 6, 5, 1, 0]) 
>>> [i for i, item in enumerate(a) if item in b] 
[0, 4] 
+0

Grazie mille! Che dire di questo caso: 'a = [1, 2, 9, 8]' e 'b = [1, 9, 1]' (b è un sottoinsieme di a) dove il risultato desiderato è '[0, 2, 0 ] '(gli indici di corrispondenza di ciascun valore in b)? Fare un set perderà l'indice del secondo '1' e la sequenza degli indici. – user1342516

+0

In tal caso, non sarebbe '[0, 2, 0, 1, 2]' o qualcosa di simile? (poiché tutti gli elementi di 'b' si verificano in entrambe le liste) – jamylak

+0

Non sono stato chiaro ... Gli" indici "risultanti di cui ho bisogno in questo caso daranno' array (a) [indici] = b'. Ho modificato la domanda. forse la descrizione è più chiara. – user1342516

5
def return_indices_of_a(a, b): 
    b_set = set(b) 
    return [i for i, v in enumerate(a) if v in b_set] 
2

Per gli elenchi più grandi questo può essere di aiuto:

for item in a: 
index.append(bisect.bisect(b,item)) 
    idx = np.unique(index).tolist() 

Assicurarsi di importare NumPy.