1260 Stimmen

Unterschied zwischen zwei Listen ermitteln

Ich habe zwei Listen in Python:

temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']

Ich möchte eine dritte Liste mit Elementen aus der ersten Liste erstellen, die nicht in der zweiten Liste enthalten sind:

temp3 = ['Three', 'Four']

Gibt es einen schnellen Weg ohne Zyklen und Kontrollen?

7voto

manhgd Punkte 59

Dies ist eine andere Lösung:

def diff(a, b):
    xa = [i for i in set(a) if i not in b]
    xb = [i for i in set(b) if i not in a]
    return xa + xb

7voto

Oksana B Punkte 359

Wenn Sie alle Werte aus der Liste entfernen möchten a die in der Liste vorhanden sind b .

def list_diff(a, b):
    r = []

    for i in a:
        if i not in b:
            r.append(i)
    return r

list_diff([1,2,2], [1])

Ergebnis: [2,2]

o

def list_diff(a, b):
    return [x for x in a if x not in b]

7voto

Jenobi Punkte 151

Nehmen wir an, wir haben zwei Listen

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

Aus den beiden obigen Listen geht hervor, dass die Positionen 1, 3, 5 in Liste2 vorhanden sind, die Positionen 7, 9 jedoch nicht. Andererseits sind die Einträge 1, 3, 5 in Liste 1 vorhanden und die Einträge 2, 4 nicht.

Was ist die beste Lösung, um eine neue Liste mit den Elementen 7, 9 und 2, 4 zurückzugeben?

Alle obigen Antworten führen zur Lösung, was ist nun das Optimum?

def difference(list1, list2):
    new_list = []
    for i in list1:
        if i not in list2:
            new_list.append(i)

    for j in list2:
        if j not in list1:
            new_list.append(j)
    return new_list

gegen

def sym_diff(list1, list2):
    return list(set(list1).symmetric_difference(set(list2)))

Mit timeit können wir die Ergebnisse sehen

t1 = timeit.Timer("difference(list1, list2)", "from __main__ import difference, 
list1, list2")
t2 = timeit.Timer("sym_diff(list1, list2)", "from __main__ import sym_diff, 
list1, list2")

print('Using two for loops', t1.timeit(number=100000), 'Milliseconds')
print('Using two for loops', t2.timeit(number=100000), 'Milliseconds')

gibt zurück.

[7, 9, 2, 4]
Using two for loops 0.11572412995155901 Milliseconds
Using symmetric_difference 0.11285737506113946 Milliseconds

Process finished with exit code 0

6voto

kqw Punkte 19295

Wenn Sie auf TypeError: unhashable type: 'list' Sie müssen Listen oder Mengen in Tupel umwandeln, z. B.

set(map(tuple, list_of_lists1)).symmetric_difference(set(map(tuple, list_of_lists2)))

Siehe auch Wie vergleicht man eine Liste von Listen/Sets in Python?

6voto

soundcorner Punkte 71

Sie könnten eine naive Methode verwenden, wenn die Elemente der difflist sortiert und gesetzt sind.

list1=[1,2,3,4,5]
list2=[1,2,3]

print list1[len(list2):]

oder mit nativen Set-Methoden:

subset=set(list1).difference(list2)

print subset

import timeit
init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]'
print "Naive solution: ", timeit.timeit('temp1[len(temp2):]', init, number = 100000)
print "Native set solution: ", timeit.timeit('set(temp1).difference(temp2)', init, number = 100000)

Naive Lösung: 0.0787101593292

Native Set-Lösung: 0.998837615564

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X