2012-07-28 27 views
6

Quindi, per dare un esempio approssimativo senza alcun codice scritto per esso ancora, sono curioso di sapere come potrei capire cosa hanno in comune entrambi gli elenchi.Confronto di due elenchi in Python

Esempio:

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

Mi piacerebbe essere in grado di tornare:

['a', 'c'] 

In che modo?

Possibilmente con le stringhe variabili, come:

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

E RITORNO:

'I love yellow and' 

risposta

16

Usa intersezione di set per questo:

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

dà:

['a', 'c'] 

Nota che, dal momento che abbiamo a che fare con set questo può non mantenere l'ordine:

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

utilizzando join() per convertire l'elenco risultante in una stringa.

-

Per esempio/commento qui sotto, questo conserverà ordine (ispirato commento da @DSM)

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

Per un caso in cui la lista non sono la stessa lunghezza , con il risultato, come specificato nel commento qui sotto:

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

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

Esiste un modo per mantenere l'ordine? – Matthew

+2

@Matthew: cosa ti piacerebbe che questo metodo restituisse in caso di '['a', 'b', 'c']' e '['c', 'b', 'd', 'a']' ? – liori

+1

Mi piacerebbe vederlo restituire '['b']'. – Matthew

2

Se le due liste sono della stessa lunghezza, si può fare un side-by-side iterati su, in questo modo:

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

Dovresti usare 'zip (lista_a, lista_b)', penso. – DSM

+0

Sei corretto. – CosmicComputer

+0

Non hanno la stessa lunghezza. Potrei avere una lista che ha ['verde'] e un'altra che ha ['rosso', 'giallo', 'verde'] E avrei bisogno di restituire ['verde'] – Matthew

1

Intersect loro come set:

set(listA) & set(listB) 
+0

potreste darmi un esempio di lavoro su come potrei sull'utilizzo con: John = 'Io amo giallo e verde' mary = 'Io amo giallo e rosso' E RITORNO: 'I love yellow e ' – Matthew

+0

'' '.join (str (x) per x in set (john.split (' ')) & set (mary.split (' ')))' – Ryan