Listen update

Code-Stücke können hier veröffentlicht werden.
Antworten
UppzEinPing
User
Beiträge: 4
Registriert: Freitag 26. April 2019, 03:00

Freitag 26. April 2019, 23:33

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
__deets__
User
Beiträge: 6059
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 26. April 2019, 23:56

wenn’s nicht auf die Reihenfolge ankommt:

a = set(a) | set(b)
Benutzeravatar
__blackjack__
User
Beiträge: 3882
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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]
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
UppzEinPing
User
Beiträge: 4
Registriert: Freitag 26. April 2019, 03:00

Samstag 27. April 2019, 00:59

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?
UppzEinPing
User
Beiträge: 4
Registriert: Freitag 26. April 2019, 03:00

Samstag 27. April 2019, 01:02

__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?
__deets__
User
Beiträge: 6059
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 27. April 2019, 08:17

Ja. Aus dem Modul itertools.
Benutzeravatar
__blackjack__
User
Beiträge: 3882
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 27. April 2019, 09:47

Und `more_itertools`. Ist zwar extern, aber sehr nützlich. Da sind die ”Rezepte” aus der `itertools`-Dokumentation und noch ein bisschen mehr drin.
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
UppzEinPing
User
Beiträge: 4
Registriert: Freitag 26. April 2019, 03:00

Samstag 27. April 2019, 17:07

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...
Benutzeravatar
DeaD_EyE
User
Beiträge: 318
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Donnerstag 2. Mai 2019, 08:44

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 10239
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 2. Mai 2019, 10:43

@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.
Antworten