2011-02-08 63 views
7

Probablemente esta es una pregunta simple que me falta pero tengo dos listas que contienen cadenas y quiero "rebotar" una, elemento por elemento, frente a la otra devolviendo el índice de las coincidencias. Espero que haya múltiples coincidencias y quiera todos los índices. Sé que list.index() obtiene el primero y puede obtener el último fácilmente. Por ejemplo:En Python, ¿cómo comparar dos listas y obtener todos los índices de coincidencias?

list1 = ['AS144','401M','31TP01'] 

list2 = ['HDE342','114','M9553','AS144','AS144','401M'] 

entonces yo iterar a través de lista1 comparación con Lista2 y salida:
[0,0,0,1,1,0] , [3,4] o etc para la primera iteración
[0,0,0,0,0,1] , [6] para segunda
y [0,0,0,0,0,0] o [] para tercera

EDIT: Perdón por cualquier confusión. Me gustaría obtener los resultados de manera tal que pueda usarlos así: tengo una tercera lista para llamar a list3 y me gustaría obtener los valores de esa lista en los índices que están superados. es decir, list3[previousindexoutput]=list of cooresponding values

Respuesta

1
[([int(item1 == item2) for item2 in list2], [n for n, item2 in enumerate(list2) if item1 == item2]) for item1 in list1] 
+8

Sé que ha pasado mucho tiempo, pero me pregunto por qué no te importa incluso publicar una oración sobre la solución. ¡Me habría ayudado mucho! – teutara

3

Esto no responde la pregunta. Ver mi comentario a continuación.

Como punto de partida:

list(i[0] == i[1] for i in zip(list1, list2)) 
+0

Esto devuelve '[Falso, falso, falso]' para mí. – gary

+0

Oh, lo siento. Yo malentendí la pregunta. Mi código devuelve una lista con 'True' o' False' si los elementos en el mismo índice de las dos listas son iguales. P.ej. para 'list1 = [1, 2, 3]' y 'list2 = [1, 2, 4]' devuelve '[True, True, False]'. Vota mi respuesta si quieres :-) –

1

no estoy seguro de cómo desea que éstos empaquetados, pero esto hace el trabajo:

def matches(lst, value): 
    return [l == value for l in lst] 

all_matches = [matches(list2, v) for l in list1] 
8

Personalmente me gustaría empezar con:

matches = [item for item in list1 if item in list2]

+0

Esto es muy bueno y creo que podría modificarse fácilmente para dar valores de índice en lugar de la lista de valores que coinciden. – Kosig

+0

@Kosig: Bueno, por supuesto, ese era el punto; si quieres los índices de las coincidencias, haces cosas como 'indices = [list1.index (i) for i in list2]' o viceversa. – porgarmingduod

+1

Poner en caché list2 en un 'conjunto' primero, porque de lo contrario, obtendrá un rendimiento de O (n * n). – recursive

0

Esto le dará una lista de las listas con Tru e/falsos valores en lugar de 1/0:

matches = [ [ list1[i] == list2[j] for j in range(0, len(list2)) ] for i in range(0, len(list1)) ] 

Editar: Si estás utilizando 2.5 o posterior, esto debe dar de 1 & de 0:

matches = [ [ 1 if list1[i] == list2[j] else 0 for j in range(0, len(list2)) ] for i in range(0, len(list1)) ] 
+0

Sí. El segundo es exactamente lo que estaba buscando. Sin embargo, ahora que tengo esos índices, ¿cómo obtengo sus valores cooresponientes de otra lista? – Kosig

+0

@Kosig: No tengo claro qué más quieres. ¿A qué te refieres con "cómo obtengo sus valores (sic) cooresponding de otra lista?" ¿Hay alguna lista diferente que no hayas mencionado en la pregunta? ¿O desea acceder a los valores originales en list1/list2? ¿Estás tratando de usar la lista de coincidencias para eso? – GreenMatt

0

Esto debería hacer lo que quiere y se puede convertir fácilmente en un generador:

>>> [[i for i in range(len(list2)) if item1 == list2[i]] for item1 in list1] 
[[3, 4], [5], []] 

Aquí hay una versión con un formato de salida ligeramente diferente:

>>> [(i, j) for i in range(len(list1)) for j in range(len(list2)) if list1[i] == list2[j]] 
[(0, 3), (0, 4), (1, 5)] 
1
def findInstances(list1, list2): 
    """For each item in list1, 
    return a list of offsets to its occurences in list2 
    """ 

    for i in list1: 
     yield [pos for pos,j in enumerate(list2) if i==j] 

list1 = ['AS144','401M','31TP01'] 
list2 = ['HDE342','114','M9553','AS144','AS144','401M'] 

res = list(findInstances(list1, list2)) 

resultados en

[[3, 4], [5], []] 
Cuestiones relacionadas