2012-04-28 11 views
10

Para dos listas a y b, ¿cómo puedo obtener los índices de valores que aparecen en ambos? Por ejemplo,comparar dos listas en python e índices de devolución de valores coincidentes

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

return_indices_of_a(a, b) 

volvería [0,4], con (a[0],a[4]) = (1,5).

+0

posible duplicado de [Python: ¿Cómo encontrar la intersección de listas?] (Http://stackoverflow.com/questions/3697432/python-how-to-find-list-intersection) – ChristopheD

+2

No creo que esta pregunta sea un duplicado de ese aunque sea similar. – jamylak

Respuesta

18

La mejor manera de hacer esto sería hacer b a set ya que solo está comprobando la membresía dentro de él.

>>> 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

¡Muchas gracias! ¿Qué pasa con este caso: 'a = [1, 2, 9, 8]' y 'b = [1, 9, 1]' (b es un subconjunto de a) donde el resultado deseado es '[0, 2, 0 ] '(los índices de una coincidencia de cada valor en b)? Hacer b un conjunto perderá el índice del segundo '1' así como la secuencia de los índices. – user1342516

+0

En ese caso, ¿no sería '[0, 2, 0, 1, 2]' o algo similar? (dado que todos los elementos de 'b' aparecen en ambas listas) – jamylak

+0

No he sido claro ... Los 'índices' resultantes que necesito en este caso darán' matriz (a) [índices] = b'. He editado la pregunta. tal vez la descripción allí sea más clara. – 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

Para listas más grandes esto puede ser de ayuda:

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

Asegúrese de importar numpy.

Cuestiones relacionadas