2016-08-07 8 views
4

Angesichts dieser Probe zu vergleichen, die während einzigartige Elemente finden verfügbar sind, um der ElementquelleEffiziente Art und Weise zwei Listen Erinnerung an den Ursprung für jedes einzigartiges Element

source_list = ["one", "two", "three", "four", "five"] 
diff_list = ["zero", "one", "two", "three", "four", "six", "seven"] 

source_unique = [] 
diff_unique = [] 

for entry in source_list: 
    if entry not in diff_list: 
     source_unique.append(entry) 

for entry in diff_list: 
    if entry not in source_list: 
     diff_unique.append(entry) 

print("Unique elements in source_list: {0}".format(source_unique)) 
print("Unique elements in diff_list: {0}".format(diff_unique)) 

### 
# Unique elements in source_list: ['five'] 
# Unique elements in diff_list: ['zero', 'six', 'seven'] 

zu sagen, ist es eine effizientere Art und Weise, dies zu tun, anstatt mit zwei zusätzlichen Listen und all dem Zeug? Die Hauptaufgabe besteht darin, die Herkunft der Elemente erkennen zu können.

Antwort

5

Durch die Verwendung von set s und nehmen ihre difference, die eine Komplexität von O(len(set_object)) hat:

>>> s1, s2 = set(source_list), set(diff_list) 
>>> s1.difference(s2) 
{'five'} 
>>> s2.difference(s1) 
{'seven', 'six', 'zero'} 

, die auch als geschrieben werden kann:

>>> s1 - s2 
{'five'} 
>>> s2 - s1 
{'seven', 'six', 'zero'}  

in diesem Fall müssen Sie möglicherweise verwandeln a list danach, falls erforderlich mit list(s1 - s2) und list(s2 - s1) entsprechend.

Oder Sie könnten das gleiche tun ein list Verständnis durch die Verwendung und Herstellung source_list und diff_list Sets für schnelle Mitgliedschaft Tests mit dem in Betreiber:

Für die uniques Liste:

source_unique = [v1 for v1 in source_list if v1 not in set(diff_list)] 
source_unique 
['five'] 

Für die diff_unique Liste:

diff_unique = [v1 for v1 in diff_list if v1 not in set(source_list)] 
diff_unique 
['zero', 'six', 'seven'] 

Das ist wieder O(len(list)), es sei denn, ich verwechsle meine Zeitkomplexität.

+1

Sie würden viel besser Laufzeiten haben, wenn Sie eingestellt die Listen vorher (O (1) Lookup-Zeiten für "in") – inspectorG4dget

1

können Sie Sets verwenden, um es zu tun

source_list = ["one", "two", "three", "four", "five"] 
diff_list = ["zero", "one", "two", "three", "four", "six", "seven"] 

source_unique = list(set(source_list) - set(diff_list)) 
diff_unique = list(set(diff_list) - set(source_list)) 
2

Sie Sets verwenden können:

source_list = ["one", "two", "three", "four", "five"] 
diff_list = ["zero", "one", "two", "three", "four", "six", "seven"] 


print("Unique elements in source_list: {0}".format(set(source_list)-set(diff_list))) 
print("Unique elements in diff_list: {0}".format(set(diff_list)-set(source_list))) 

Ausdrucken:

Unique elements in source_list: set(['five']) 
Unique elements in diff_list: set(['seven', 'six', 'zero']) 
+1

Oh, das sieht super einfach aus mit Sets! Ich habe die gleiche Frage, aber nur über den Unterschied gefunden. Habe nicht herausgefunden, dass ich den eingestellten Unterschied in beiden Richtungen finden kann! Vielen Dank. – light2yellow

+0

Ich bin froh, dass es geholfen hat :) – Heval

+0

Aber ich werde Jims Antwort akzeptieren (wenn es Ihnen nichts ausmacht) nur für die Vollständigkeit des Inhalts, falls andere Benutzer auf dasselbe Problem stoßen. – light2yellow

Verwandte Themen