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?

6voto

Alex Jacob Punkte 79

Ich bin zwar etwas zu spät dran, aber man kann die Leistung einiger der oben genannten Codes damit vergleichen, zwei der schnellsten Anwärter sind,

list(set(x).symmetric_difference(set(y)))
list(set(x) ^ set(y))

Ich entschuldige mich für das elementare Niveau der Kodierung.

import time
import random
from itertools import filterfalse

# 1 - performance (time taken)
# 2 - correctness (answer - 1,4,5,6)
# set performance
performance = 1
numberoftests = 7

def answer(x,y,z):
    if z == 0:
        start = time.clock()
        lists = (str(list(set(x)-set(y))+list(set(y)-set(y))))
        times = ("1 = " + str(time.clock() - start))
        return (lists,times)

    elif z == 1:
        start = time.clock()
        lists = (str(list(set(x).symmetric_difference(set(y)))))
        times = ("2 = " + str(time.clock() - start))
        return (lists,times)

    elif z == 2:
        start = time.clock()
        lists = (str(list(set(x) ^ set(y))))
        times = ("3 = " + str(time.clock() - start))
        return (lists,times)

    elif z == 3:
        start = time.clock()
        lists = (filterfalse(set(y).__contains__, x))
        times = ("4 = " + str(time.clock() - start))
        return (lists,times)

    elif z == 4:
        start = time.clock()
        lists = (tuple(set(x) - set(y)))
        times = ("5 = " + str(time.clock() - start))
        return (lists,times)

    elif z == 5:
        start = time.clock()
        lists = ([tt for tt in x if tt not in y])
        times = ("6 = " + str(time.clock() - start))
        return (lists,times)

    else:    
        start = time.clock()
        Xarray = [iDa for iDa in x if iDa not in y]
        Yarray = [iDb for iDb in y if iDb not in x]
        lists = (str(Xarray + Yarray))
        times = ("7 = " + str(time.clock() - start))
        return (lists,times)

n = numberoftests

if performance == 2:
    a = [1,2,3,4,5]
    b = [3,2,6]
    for c in range(0,n):
        d = answer(a,b,c)
        print(d[0])

elif performance == 1:
    for tests in range(0,10):
        print("Test Number" + str(tests + 1))
        a = random.sample(range(1, 900000), 9999)
        b = random.sample(range(1, 900000), 9999)
        for c in range(0,n):
            #if c not in (1,4,5,6):
            d = answer(a,b,c)
            print(d[1])

6voto

pylang Punkte 33775

Hier sind ein paar einfache, ordnungserhaltend Möglichkeiten, zwei Listen von Zeichenketten zu vergleichen.

Code

Ein ungewöhnlicher Ansatz mit pathlib :

import pathlib

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

p = pathlib.Path(*temp1)
r = p.relative_to(*temp2)
list(r.parts)
# ['Three', 'Four']

Dies setzt voraus, dass beide Listen Zeichenketten mit gleichem Anfang enthalten. Siehe die 諸注意 für weitere Einzelheiten. Beachten Sie, dass sie im Vergleich zu Mengenoperationen nicht besonders schnell ist.


Eine unkomplizierte Implementierung mit itertools.zip_longest :

import itertools as it

[x for x, y in it.zip_longest(temp1, temp2) if x != y]
# ['Three', 'Four']

6voto

Shakhyar Gogoi Punkte 96

Ich bevorzuge die Konvertierung in Mengen und die anschließende Verwendung der Funktion "difference()". Der vollständige Code lautet :

temp1 = ['One', 'Two', 'Three', 'Four'  ]                   
temp2 = ['One', 'Two']
set1 = set(temp1)
set2 = set(temp2)
set3 = set1.difference(set2)
temp3 = list(set3)
print(temp3)

Salida:

>>>print(temp3)
['Three', 'Four']

Es ist am einfachsten zu verstehen, und außerdem werden in Zukunft, wenn Sie mit großen Daten arbeiten, durch die Konvertierung in Sets Duplikate entfernt, wenn diese nicht erforderlich sind. Hoffentlich hilft es ;-)

5voto

Ich weiß, dass diese Frage bereits gut beantwortet wurde, aber ich möchte die folgende Methode hinzufügen, indem ich numpy .

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

list(np.setdiff1d(temp1,temp2))

['Four', 'Three'] #Output

3voto

Wir können Schnittpunkt minus Vereinigung von Listen berechnen:

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

set(temp1+temp2)-(set(temp1)&set(temp2))

Out: set(['Four', 'Five', 'Three'])

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