2012-07-05 21 views
22

Sto provando a scrivere un pezzo di codice in grado di scomporre automaticamente un'espressione. Ad esempio, se ho due elenchi [1,2,3,4] e [2,3,5], il codice dovrebbe essere in grado di trovare gli elementi comuni nei due elenchi, [2,3] e combinare il resto degli elementi insieme in una nuova lista, essendo [1,4,5].Trova elementi non comuni negli elenchi

da questo post: How to find list intersection? vedo che gli elementi comuni possono essere trovati

set([1,2,3,4]&set([2,3,5]). 

C'è un modo semplice per recuperare elementi non comuni da ciascuna lista, nel mio esempio è [1,4 ] e [5]?

Posso andare avanti e fare un ciclo for:

lists = [[1,2,3,4],[2,3,5]] 
conCommon = [] 
common = [2,3] 
for elem in lists: 
    for elem in eachList: 
    if elem not in common: 
     nonCommon += elem 

ma questo sembra ridondante e inefficiente. Python fornisce qualche funzione utile che possa farlo? Grazie in anticipo!!

+0

si vuole ottenere liste separate come [1,4] e [5], o uno solo [1,4,5]? – nye17

risposta

40

utilizzare l'operatore differenza simmetrica per set s (aka l'operatore XOR):

>>> set([1,2,3])^set([3,4,5]) 
set([1, 2, 4, 5]) 
+0

oh wow grazie !! Bue fa il codice sopra prende uguale quantità di tempo di calcolo e spazio di memoria come impostato ([1,2,3]) e set ([3,4,5])? O non ha un'influenza significativa sulle prestazioni del codice? – turtlesoup

+0

È il modo più efficace per raggiungere il tuo obiettivo. La sua complessità è nello stesso ordine di '&' (vale a dire, lineare nel numero di elementi negli insiemi). – Amber

12

È possibile utilizzare Intersezione concetto per affrontare questo tipo di problemi.

b1 = [1,2,3,4,5,9,11,15] 
b2 = [4,5,6,7,8] 
set(b1).intersection(b2) 
Out[22]: {4, 5} 

La cosa migliore dell'utilizzo di questo codice è che funziona anche rapidamente per i dati di grandi dimensioni. Ho b1 con 607139 e b2 con 296029 elementi quando uso questa logica ottengo i miei risultati in 2,9 secondi.

0

È possibile utilizzare il metodo di attributo .__xor__.

set([1,2,3,4]).__xor__(set([2,3,5])) 

o

a = set([1,2,3,4]) 
b = set([2,3,5]) 
a.__xor__(b) 
Problemi correlati