621 Stimmen

Alle Elemente, die in einer Liste vorkommen, aus einer anderen entfernen

Nehmen wir an, ich habe zwei Listen, l1 y l2 . Ich möchte auftreten l1 - l2 die alle Elemente von l1 nicht in l2 .

Ich kann mir eine naive Schleifenlösung vorstellen, aber das wäre wirklich ineffizient. Was ist ein pythonischer und effizienter Weg, dies zu tun?

Ein Beispiel: Wenn ich l1 = [1,2,6,8] and l2 = [2,3,5,8] , l1 - l2 sollte zurückkehren [1,6]

28 Stimmen

Nur ein Tipp: PEP8 besagt, dass das kleine "L" nicht verwendet werden sollte, weil es zu sehr wie eine 1 aussieht.

3 Stimmen

Ich stimme zu. Ich habe diese ganze Frage und die Antworten gelesen und mich gefragt, warum die Leute immer wieder elf und zwölf verwenden. Erst als ich den Kommentar von @spelchekr las, ergab es einen Sinn.

1 Stimmen

1voto

do-me Punkte 581

Benchmark zum Verständnis von Mengen und Listen in Python 3.8

(unter Berücksichtigung der Benchmarks von Moinuddin Quadri)

tldr: Verwendung Arkku's eingestellte Lösung ist es sogar schneller als versprochen im Vergleich!

Prüfen vorhandener Dateien anhand einer Liste

In meinem Beispiel habe ich Folgendes festgestellt 40 Mal (!) schneller in der Anwendung Arkku's eingestellte Lösung als die pythonisches Listenverständnis für eine reale Anwendung zur Überprüfung vorhandener Dateinamen anhand einer Liste.

Verständnis der Liste:

%%time
import glob
existing = [int(os.path.basename(x).split(".")[0]) for x in glob.glob("*.txt")]
wanted = list(range(1, 100000))
[i for i in wanted if i not in existing]

Wandzeit: 28,2 s

Sätze

%%time
import glob
existing = [int(os.path.basename(x).split(".")[0]) for x in glob.glob("*.txt")]
wanted = list(range(1, 100000))
set(wanted) - set(existing)

Wandzeit: 689 ms

0voto

SX10 Punkte 30

Versuchen Sie dies:

l1=[1,2,6,8]
l2=[2,3,5,8]
r=[]
for x in l1:
    if x in l2:
        continue
    r=r+[x]
print(r)

-1voto

Karl Knechtel Punkte 55450

Aufrechterhaltung der Ordnung durch Ausnutzung der geordneten Eigenschaft von Dicts (Python 3.7+)

Hinweis: Die Referenzimplementierung von dicts in Python 3.6 behält die Schlüssel in der Reihenfolge ihrer Einfügung bei, aber dies wird von der Spezifikation nicht garantiert. Für 3.7 und höher wurde diese Garantie hinzugefügt.

Die Schlüssel eines dict Funktion als eine Art von set Duplikate werden implizit herausgefiltert, und die Suche ist aufgrund des Hash-Verfahrens effizient. Daher können wir einen "Mengenunterschied" implementieren, indem wir ein Diktat mit l1 als Schlüssel, und dann das Entfernen aller Schlüssel, die in l2 . Dadurch wird die Ordnung aufrechterhalten und ein schneller Algorithmus verwendet, der jedoch einen erheblichen Overhead durch den konstanten Faktor verursacht.

d = dict.fromkeys(l1)
for i in l2:
    try:
        del d[i]
    except KeyError:
        pass
l3 = list(d.keys())

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