2012-07-28 46 views
6

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

Ejemplo:

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

me gustaría ser capaz de volver:

['a', 'c'] 

¿Cómo así?

Posiblemente con cadenas de variables como:

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

y regreso:

'I love yellow and' 

Respuesta

16

Uso intersección de conjuntos para esto:

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

da:

['a', 'c'] 

Tenga en cuenta que dado que se trata de conjuntos esto puede no preservar el orden:

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

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

-

Para su ejemplo/comentario más abajo, este preservará fin (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 son de la misma longitud , con el resultado como se especifica 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'] 
+0

¿Hay alguna forma de preservar el orden? – Matthew

+2

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

+1

Me gustaría ver que devuelva '['b']'. – Matthew

2

Si las dos listas tienen la misma longitud, se puede hacer un iterati de lado a lado sobre, así:

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

Tendría que usar 'zip (list_a, list_b)', creo. – DSM

+0

Tiene razón. – CosmicComputer

+0

No tienen la misma longitud. Podría tener una lista que tenga ['verde'] y otra que tenga ['rojo', 'amarillo', 'verde'] Y la necesitaría para devolver ['verde'] – Matthew

1

Intersección como conjuntos:

set(listA) & set(listB) 
+0

Podría darme un ejemplo de trabajo en la forma que pude acerca de su uso con: john = 'Me encanta amarillo y verde' mary = 'Me encanta amarillo y rojo' y regreso: 'I love yellow y ' – Matthew

+0

'' '.join (str (x) para x en conjunto (john.split (' ')) & set (mary.split (' ')))' – Ryan