2013-04-22 15 views
32

Sto provando a confrontare due elenchi e semplicemente stampare un messaggio se qualsiasi valore dal primo elenco è nel secondo elenco.Verifica se qualche elemento in un elenco si trova in un altro

def listCompare(): 
    list1 = [1, 2, 3, 4, 5] 
    list2 = [5, 6, 7, 8, 9] 
    if list1 in list2: 
    print("Number was found") 
    else: 
    print("Number not in list") 

In questo esempio, voglio che la if per valutare a True perché 5 è in entrambe le liste. Questo non funziona e non sono sicuro del modo più semplice per confrontare le due liste.

+0

Ho preso due azioni su questa domanda: ho modificato la domanda per chiarire qual è l'evidente punto originale della domanda: determinare se qualsiasi valore in una lista è in un'altra lista. Credo che questo sia l'intento originale, date le risposte migliori sull'indirizzo della domanda e che @ h1h1 abbia selezionato una risposta che lo risolva. h1h1 non esiste da anni, quindi non potevo chiedergli di chiarire. La seconda azione intrapresa è stata quella di ripristinare la risposta accettata al suo stato prima che fosse parzialmente modificato per indirizzare "determinare se tutti gli elementi di una lista sono in una seconda lista". –

risposta

64

Si potrebbe risolvere questo molti modi. Uno che è abbastanza semplice da capire è usare solo un ciclo.

def comp(list1, list2): 
    for val in list1: 
     if val in list2: 
      return True 
    return False 

Un modo più compatto che si può fare è quello di utilizzare map e reduce:

reduce(lambda v1,v2: v1 or v2, map(lambda v: v in list2, list1)) 

Ancora meglio, il reduce possono essere sostituiti con any:

any(map(lambda v: v in list2, list1)) 

Si potrebbe anche utilizzare set:

len(set(list1).intersection(list2)) > 0 
+0

Grazie per l'aiuto David! – h1h1

+4

la prima versione non funziona (quando solo un valore è in entrambi gli elenchi, si ottiene True non solo quando tutti i valori sono in entrambi gli elenchi) – thias

+2

il primo approccio è errato. Sta comparando da list1 verso list2. Un confronto basato sul ciclo deve essere eseguito da entrambe le prospettive, anche dalla lista2 alla lista1. Ad esempio: per val in list2: ... se val in list1 ... ecc. Inoltre, si restituisce True se il primo valore si trova su list2, il che significa che non procederà a confrontare tutti i valori. L'istruzione if interna dovrebbe essere (se val non in list2: return False), il che significa che continuerà fino a quando ci sono valori corretti dal primo all'ultimo elemento. – gextra

14

Ci sono diversi modi. Se si desidera solo per controllare se una lista contiene alcun elemento dalla altro elenco, si può fare questo ..

not set(list1).isdisjoint(list2) 

Credo che usando isdisjoint è meglio di intersection per Python 2.6 e superiori.

8

Il tuo approccio originale può lavorare con una lista di comprensione:

def listCompare(): 
    list1 = [1, 2, 3, 4, 5] 
    list2 = [5, 6, 7, 8, 9] 
    if [item for item in list1 if item in list2]: 
    print("Number was found") 
    else: 
    print("Number not in list") 
9

v'è una costruito in funzione per confrontare le liste:

seguito è riportata la sintassi per cmp() il metodo -

cmp(list1, list2) 

#!/usr/bin/python 

list1, list2 = [123, 'xyz'], [123, 'xyz'] 

print cmp(list1,list2) 

Quando eseguiamo il programma sopra, esso produce il seguente risultato:

0 

Se il risultato è un pareggio, il che significa che viene restituito 0

+0

Questo non risponde alla domanda. OP vuole sapere se è stato trovato lo stesso valore in entrambe le liste. – Martin

6

è possibile modificare le liste ai set e quindi confrontare entrambi i gruppi utilizzando la funzione &. es:

list1 = [1, 2, 3, 4, 5] 
list2 = [5, 6, 7, 8, 9] 

if set(list1) & set(list2): 
    print "Number was found" 
else: 
    print "Number not in list" 

L'operatore "&" dà il punto di intersezione tra i due gruppi. Se c'è un'intersezione, verrà restituito un insieme con i punti di intersezione. Se non ci sono punti intersecanti, verrà restituito un set vuoto.

Quando si valuta un insieme/elenco/dict/tuple vuoto con l'operatore "if" in Python viene restituito il valore booleano False.

1

Ho scritto il seguente codice in uno dei miei progetti. Confronta sostanzialmente ogni singolo elemento della lista. Sentiti libero di usarlo, se funziona per le tue esigenze.

def reachedGoal(a,b): 
    if(len(a)!=len(b)): 
     raise ValueError("Wrong lists provided") 

    for val1 in range(0,len(a)): 
     temp1=a[val1] 
     temp2=b[val1] 
     for val2 in range(0,len(b)): 
      if(temp1[val2]!=temp2[val2]): 
       return False 
    return True 
Problemi correlati