2011-01-12 16 views
12

Ich möchte eine Liste aus zwei separaten Listen von einzigartigen Gegenständen machen.Wie nehme ich zwei Listen und kombiniere sie ohne Duplikate?

Es gibt andere ähnliche Fragen, aber es schien niemanden zu geben, der dieses Problem effektiv lösen könnte, da die Listen einige Millionen Elemente lang sind.

Völlig unabhängig: bin ich der einzige, der hasst, wie der Tag-Vorschlags-Kasten den Knopf "Ihre Frage posten" verdeckt?

+3

Besteht der Auftrag von Gegenstände in den Listen zählen? –

+0

nein, aber sie sind nicht sortiert –

Antwort

31

Verwenden Sie eine set.

>>> first = [1, 2, 3, 4] 
>>> second = [3, 2, 5, 6, 7] 
>>> third = list(set(first) | set(second))  # '|' is union 
>>> third 
[1, 2, 3, 4, 5, 6, 7] 
+1

Wie kann ich es tun, ohne Set? – Dejell

+6

Hey user225312, gewinnst du etwas, indem du set() zweimal aufruft und union benutzt? Instinktiv würde ich einfach Liste schreiben (set (first + second)). – Cawb07

+0

Bitte beachten Sie, dass dieser Ansatz nicht verwendet werden kann, wenn die Listen nicht hashbare Typen enthalten (zB Listen von Wörterbüchern) – Luke404

6
>>> l1 = range(10) 
>>> l2 = range(5, 15) 
>>> set(l1) | set(l2) 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) 
2

Wenn jemand es ohne set() tun wollen:

a = [1,2,3] 
b = [2,3,4] 
newlist=[] 
for i in a: 
    newlist.append(i) 
for z in b: 
    if z not in newlist: 
     newlist.append(z) 
newlist.sort() 
print newlist 
10

Ein etwas effizienter Weg, es zu tun:

>>> first = [1, 2, 3, 4] 
>>> second = [3, 2, 5, 6, 7] 

# New way 
>>> list(set(first + second)) 
[1, 2, 3, 4, 5, 6, 7] 
#1000000 loops, best of 3: 1.42 µs per loop 

# Old way 
>>> list(set(first) | set(second)) 
[1, 2, 3, 4, 5, 6, 7] 
#1000000 loops, best of 3: 1.83 µs per loop 

Die neue Art und Weise effizienter ist, weil es nur hat ein Satz() anstelle von 2.

Verwandte Themen