Doppelte Elemente einer Liste elegant entfernen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Beitragvon keppla » Donnerstag 29. Januar 2009, 17:59

HWK hat geschrieben:@hendrikS: Deins ist zwar weniger Quellcode, dürfte bei langen Listen aber deutlich länger brauchen, da count() die Liste ja jedesmal neu durchlaufen muss.


Das mag stimmen, aber premature optimisation is the root of all evil und so. Ich hab jüngst erst festgestellt, dass einer meiner algorithmen durchs (ineffiziente) stringaneinanderkleben gar nicht so sehr verlangsamt wurde wie durch meine Optimierungsansätze.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Beitragvon gkuhl » Donnerstag 29. Januar 2009, 18:00

numerix hat geschrieben:Ups, Spam zitiert - jetzt entfernt.

So einen kleinen fleißigen Bot, der häufige Anfängerfragen beanwortet, würde sich hier im Forum auch ganz hübsch machen. 8)
n4p
User
Beiträge: 55
Registriert: Dienstag 10. Juni 2008, 11:05

Beitragvon n4p » Donnerstag 29. Januar 2009, 18:24

Der müsste ja quasi nur die Ergebnisse der Suche als Link posten wenn möglichst viele Worte aus der Anfrage oft gefunden werden.

Wer das ohne false positives hinbekommt kann sich da ja mal dran machen :)
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Beitragvon hendrikS » Donnerstag 29. Januar 2009, 18:38

numerix hat geschrieben:Im übrigen war das ursprüngliche Problem in diesem Thread schon gelöst ...


Ich fände es gut, wenn ein Problem gelöst ist, es auch als solches zu markieren. Hat mich nicht viel Zeit gekostet.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 29. Januar 2009, 19:17

hendrikS hat geschrieben:Ich fände es gut, wenn ein Problem gelöst ist, es auch als solches zu markieren. Hat mich nicht viel Zeit gekostet.

Ich fände es schlecht und das wurde auch schon mehrfach diskutiert. Die Nachteile des "gelöst" markierens überwiegen.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Beitragvon hendrikS » Donnerstag 29. Januar 2009, 19:28

Oh, was sind denn das fuer schwerwiegende Nachteile?

Vielleicht sollte man dann auch mal piddons "netiquette" updaten.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 29. Januar 2009, 20:14

hendrikS hat geschrieben:Oh, was sind denn das fuer schwerwiegende Nachteile?

Kurz gefasst: Das die Lösung nicht immer optimal sein muss und so Leute die eine viel bessere Lösung wüssten ggf. gar nicht rein schauen. Und gelöste Threads anschauen hat noch niemanden geschadet, dabei kann man eigentlich nur lernen.

hendrikS hat geschrieben:Vielleicht sollte man dann auch mal piddons "netiquette" updaten.

Ja, ich will das demnächst ins Wiki verschieben. Nicht dass das jemand liest aber immerhin kann ich dann besser darauf linken.

Edit: Habe die aktuelle Version etwas angepasst und unter [wiki]Forum/Regeln[/wiki] geschrieben. Werde das in den "Vor dem Posten lesen"-Posts eintragen.
Zuletzt geändert von Leonidas am Donnerstag 29. Januar 2009, 22:27, insgesamt 1-mal geändert.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Beitragvon würmchen » Donnerstag 29. Januar 2009, 21:03

ich hab hierzu mal ein recht interessantes Benchmark gefunden...

http://www.peterbe.com/plog/uniqifiers-benchmark

unterscheidet auch die Geschwindigkeit, ob die Reihenfolge behalten soll usw...
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Beitragvon str1442 » Donnerstag 29. Januar 2009, 21:12

Code: Alles auswählen

>>> def f(ls):
...  return reduce(lambda a, b: a + [b] if b not in a else a, ls, list())
...
>>> f([1, 1, 2, 1, 3, 4, 5, 6, 4, 5, 6, 9, 11, 9, 9, 12, 9, 14])
[1, 2, 3, 4, 5, 6, 9, 11, 12, 14]


Um reduce() mal wieder benutzt zu sehen :)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 29. Januar 2009, 21:55

str1442 hat geschrieben:

Code: Alles auswählen

>>> def f(ls):
...  return reduce(lambda a, b: a + [b] if b not in a else a, ls, list())
...
>>> f([1, 1, 2, 1, 3, 4, 5, 6, 4, 5, 6, 9, 11, 9, 9, 12, 9, 14])
[1, 2, 3, 4, 5, 6, 9, 11, 12, 14]


Um reduce() mal wieder benutzt zu sehen :)


Wobei das jetzt aber keine Lösung der ursprünglichen Problemstellung ist .. :wink:
BlackJack

Beitragvon BlackJack » Freitag 30. Januar 2009, 02:25

Nur mal so nebenbei: Ich finde es fällt nicht unter "premature optimization" wenn man Algorithmen mit quadratischer Laufzeit nicht elegant findet, wenn es Alternativen gibt, die in einer "niedrigeren" Komplexitätsklasse liegen.

Die "list comprehensions" mit `count` finde ich jedenfalls nicht so gut. Das skaliert so überhaupt nicht, und so etwas sollte man sich gar nicht erst angewöhnen.

Habe gestern zum Beispiel so ineffizienten Code in einem Programm ersetzt, das mit ~100 Dateien absolut kein Problem hatte, bei 7000 aber plötzlich eine halbe Stunde gebraucht hat. Jetzt ist auch das nur eine Sache von Sekunden.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Freitag 30. Januar 2009, 02:39

würmchen hat geschrieben:ich hab hierzu mal ein recht interessantes Benchmark gefunden...

http://www.peterbe.com/plog/uniqifiers-benchmark

unterscheidet auch die Geschwindigkeit, ob die Reihenfolge behalten soll usw...
Das is nich die Lösung von der Problemstellung ._. Er will die löschen, die doppelt vorhanden sind... Nochmal genau lesen.

Außerdem find ichs ein bissel verwirrend oO set(iterable) ist zum eliminieren von doppelten Einträgen wohl am schönsten.
lunar

Beitragvon lunar » Freitag 30. Januar 2009, 11:54

Ich hab jüngst erst festgestellt, dass einer meiner algorithmen durchs (ineffiziente) stringaneinanderkleben gar nicht so sehr verlangsamt wurde wie durch meine Optimierungsansätze.

Dir ist aber schon klar, dass die Effizienz der String-Konkatenation in CPython auf einem Implementierungsdetail beruht?

Wer ist online?

Mitglieder in diesem Forum: brainstir