Comparando dos listas en Python

Entonces, para dar un ejemplo aproximado sin ningún código escrito todavía, tengo curiosidad sobre cómo podría averiguar qué tienen en común ambas listas.

Ejemplo:

listA = ['a', 'b', 'c']
listB = ['a', 'h', 'c']

Me gustaría poder regresar:

['a', 'c']

¿Cómo es eso?

Posiblemente con cadenas variables como:

john = 'I love yellow and green'
mary = 'I love yellow and red'

Y volver:

'I love yellow and'

preguntado el 28 de julio de 12 a las 03:07

4 Respuestas

Use la intersección establecida para esto:

list(set(listA) & set(listB))

da:

['a', 'c']

Tenga en cuenta que dado que estamos tratando con conjuntos esto puede no conservar el orden:

' '.join(list(set(john.split()) & set(mary.split())))
'I and love yellow'

usar join() para convertir la lista resultante en una cadena.

--

Para su ejemplo/comentario a continuación, este preservará el orden (inspirado por el comentario de @DSM)

' '.join([j for j, m in zip(john.split(), mary.split()) if j==m])
'I love yellow and'

Para un caso en el que la lista no tenga la misma longitud, con el resultado especificado en el comentario a continuación:

aa = ['a', 'b', 'c']
bb = ['c', 'b', 'd', 'a']

[a for a, b in zip(aa, bb) if a==b]
['b']

Respondido 28 Jul 12, 11:07

¿Hay alguna forma de preservar el orden? - Mateo

@Matthew: ¿qué le gustaría que devolviera este método en caso de ['a', 'b', 'c'] y ['c', 'b', 'd', 'a']? - liori

me gustaría verlo regresar ['b']. - Mateo

' '.join([j for j, m in zip(john.split(), mary.split()) if j==m]) es exactamente lo que estoy buscando! ¡Ahora a ver cómo lo hiciste para aprender yo mismo! ¡Muchas gracias! ¿Cómo haría para verificar un total de, digamos, 5 cadenas al mismo tiempo? - Mateo

@Matthew Podría extender este ejemplo a más listas, zip puede manejar más de dos listas, por ejemplo, for i,j,k in zip(aa, bb, cc): print i, j, k .. si su problema termina siendo más complejo, podrían existir otras soluciones (pero esa debería ser una pregunta / publicación diferente) - Levon

Creo que esto es lo que quieres Pregúntame cualquier cosa Trataré de responder.

    listA = ['a', 'b', 'c']
listB = ['a', 'h', 'c']
new1=[]
for a in listA:
    if a in listB:
        new1.append(a)

john = 'I love yellow and green'
mary = 'I love yellow and red'
j=john.split()
m=mary.split()
new2 = []
for a in j:
    if a in m:
        new2.append(a)
x = " ".join(new2)
print(x)

Respondido 07 Jul 20, 11:07

Si las dos listas tienen la misma longitud, puede hacer una iteración en paralelo, así:

list_common = []
for a, b in zip(list_a, list_b):
    if a == b:
        list_common.append(a)

Respondido 28 Jul 12, 03:07

Necesitarías usar zip(list_a, list_b), Creo. - DSM

No son del mismo largo. Podría tener una lista que tiene ['verde'] y otra que tiene ['rojo', 'amarillo', 'verde'] Y necesitaría que devuelva ['verde'] - Mateo

Entonces sí, vaya con la opción de configuración presentada por otros usuarios. - CósmicaEquipo

Intersecarlos como conjuntos:

set(listA) & set(listB)

Respondido 28 Jul 12, 03:07

¿Podría darme un ejemplo práctico sobre cómo podría usarlo con: john = 'Me encanta el amarillo y el verde' mary = 'Me encanta el amarillo y el rojo' Y volver: 'Me encanta el amarillo y' - Mateo

' '.join(set(john.split(' ')) & set(mary.split(' '))) - Ry-

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.