Seite 1 von 1

Listen update

Verfasst: Freitag 26. April 2019, 23:33
von UppzEinPing
Hi Leute, mir fehlen grade die Worte, um nach dem Problem zu googeln.
vllt bin ich auch grad bisschen braintot...

und Zwar mein Problem:

a = [1, 2, 3]
b = [2, 4, 5]

nun möchte ich die Liste a updaten... aber ohne dass er die 2 nich noch einmal in die Liste a mit einfügt.
Ergebnis sollte dann so aussehen:

a = [1, 2, 3, 4, 5]

wahrscheinlich ists total einfach aber ich komm einfach nicht drauf
lg Ping

Re: Listen update

Verfasst: Freitag 26. April 2019, 23:56
von __deets__
wenn’s nicht auf die Reihenfolge ankommt:

a = set(a) | set(b)

Re: Listen update

Verfasst: Samstag 27. April 2019, 00:38
von __blackjack__
Falls es auf die Reihenfolge ankommt, würde ich `itertools.chain()` und `more_itertools.unique_everseen()` kombinieren:

Code: Alles auswählen

In [15]: a
Out[15]: [1, 2, 3]

In [16]: b
Out[16]: [2, 4, 5]

In [17]: list(unique_everseen(chain(a, b)))
Out[17]: [1, 2, 3, 4, 5]

Re: Listen update

Verfasst: Samstag 27. April 2019, 00:59
von UppzEinPing
Danke euch für die schnelle Antwort. Nun habe ich doch schon eine Lösung gefunden...

list1 = ["cat", "car", "mouse"]
list2 = ["mouse", "house"]
# c = [item for item in a if item not in b]
d = [item for item in list2 if item not in list1]
print("list1", list1)
print("Liste ohne gleiche Elemente =", d)
list1 = list1 + d
print("list1", list1)

Wie schließt man einen Beitrag?

Re: Listen update

Verfasst: Samstag 27. April 2019, 01:02
von UppzEinPing
__blackjack__ hat geschrieben: Samstag 27. April 2019, 00:38 Falls es auf die Reihenfolge ankommt, würde ich `itertools.chain()` und `more_itertools.unique_everseen()` kombinieren:

Code: Alles auswählen

In [15]: a
Out[15]: [1, 2, 3]

In [16]: b
Out[16]: [2, 4, 5]

In [17]: list(unique_everseen(chain(a, b)))
Out[17]: [1, 2, 3, 4, 5]
FRAGE: Bei mir erkennt er unique_everseen und chain nicht. muss ich dazu irgendetwas importieren?

Re: Listen update

Verfasst: Samstag 27. April 2019, 08:17
von __deets__
Ja. Aus dem Modul itertools.

Re: Listen update

Verfasst: Samstag 27. April 2019, 09:47
von __blackjack__
Und `more_itertools`. Ist zwar extern, aber sehr nützlich. Da sind die ”Rezepte” aus der `itertools`-Dokumentation und noch ein bisschen mehr drin.

Re: Listen update

Verfasst: Samstag 27. April 2019, 17:07
von UppzEinPing
Ja das mit den Itertools scheint mir viel einfacher zu sein, als das was ich da habe. danke dir werde ich mir auf jedenfall mal etwas reinziehen die itertools...

Re: Listen update

Verfasst: Donnerstag 2. Mai 2019, 08:44
von DeaD_EyE
Hier ist der Quellcode: https://more-itertools.readthedocs.io/e ... e_everseen

Etwas vereinfacht, um die Funktionalität zu verstehen.

Code: Alles auswählen

def unique_chain(*lists):
    seen = set()
    iterator = itertools.chain.from_iterable(lists)
    for value in iterator:
        if value not in seen:
            yield value
            seen.add(value)
seen ist ein set und ein set enthält jedes Element nur einmal. Der Test ob ein Element im Set vorhanden ist, ist sehr perfomant.
In der Funktion wird über die listen iteriert und jedes mal wird nachgesehen, ob das Element in seen ist.
Bei sehr großen Listen, muss man aber bedenken, dass alle vorgekommen Elemente sich im Speicher befinden.

Re: Listen update

Verfasst: Donnerstag 2. Mai 2019, 10:43
von Sirius3
@UppzEinPing: sollen denn auch alle doppelten Einträge in der ersten oder zweiten Liste entfernt werden? Oder tritt dieser Fall gar nicht auf, weil sichergestellt ist, dass die erste und zweite Liste nur eindeutige Einträge enthalten?

Und die Frage, ob die Reihenfolge wichtig ist, hast Du auch noch nicht beantwortet. Falls nein, nimm Sets, wie __deets__ schon geschrieben hatte.