Seite 1 von 2
Aus einer Liste doppelte Einträge entfernen (Einzeiler)
Verfasst: Sonntag 6. Oktober 2002, 02:09
von Beyond
Hierbei bleibt allerdings die Reihenfolge nicht erhalten.
Python das fast wie Perl ausschaut
Code: Alles auswählen
listD= reduce(lambda d,v:(d.setdefault(v,None),d)[1], listD, {}).keys()
[/code]
Verfasst: Dienstag 8. Oktober 2002, 03:39
von Gast
Hier bleibt die Sortierung erhalten.
Code: Alles auswählen
longList= ['A','B','A','C','D','A','E','F','D']
redList=map(lambda tpl:tpl[0], filter(lambda tpl: longList.index(tpl[0])==tpl[1], zip(longList, xrange(len(longList)))))
Verfasst: Dienstag 7. Oktober 2003, 00:05
von Beyond
Habe jetzt noch eine Lösung, bei der die Sortierung erhalten bleibt, und nur einmal eine Liste erstellt wird.
Code: Alles auswählen
reduce(lambda lP,itemP: (itemP not in lP) and lP.append(itemP) or lP, LONGLIST, [])
cu beyond
Verfasst: Dienstag 7. Oktober 2003, 02:31
von Dookie
Hallo,
hier mal eine Python2.3 Version, leider bleibt die Sortierung auch hier nicht erhalten.
Code: Alles auswählen
>>> from sets import Set
>>> longList = ['A', 'B', 'A', 'C', 'D', 'A', 'E', 'F', 'D']
>>> list(Set(longList))
['A', 'C', 'B', 'E', 'D', 'F']
Dookie
Verfasst: Dienstag 7. Oktober 2003, 08:52
von Voges
Hallo!
Mein Vorschlag, wenn die Sortierung erhalten bleiben soll (enumerate() gibt es ab 2.3):
Code: Alles auswählen
longList = ['A', 'B', 'A', 'C', 'D', 'A', 'E', 'F', 'D']
print [item for i,item in enumerate(longList) if i == "".join(longList).find(item)]
Sehr performant wird das aber wegen des join() nicht sein. Aber Einzeiler war gefragt

Jan
Verfasst: Dienstag 7. Oktober 2003, 12:00
von Voges
Einen hab' ich noch:
Code: Alles auswählen
[item for i,item in enumerate(longList) if item not in longList[:i]]
Jan
Verfasst: Dienstag 7. Oktober 2003, 14:24
von Milan
und für die nich 2.3er übersetzt (mir fällt nix weiter ein

):
Verfasst: Donnerstag 9. Oktober 2003, 12:14
von Beyond
Hätte gar nicht gedacht, daß es soviele Möglichkeiten dafür gibt.
mit dictionary gehts auch
Verfasst: Dienstag 21. September 2004, 12:49
von GM
Man kann auch die Liste in ein Dictionary und zurück wandeln (Sortierung geht flöten):
dict.fromkeys([1,2,3,4,1], None).keys()
Verfasst: Dienstag 7. Dezember 2004, 16:27
von jens
Verfasst: Dienstag 7. Dezember 2004, 18:43
von fs111
Dookie hat geschrieben:Hallo,
hier mal eine Python2.3 Version, leider bleibt die Sortierung auch hier nicht erhalten.
Code: Alles auswählen
>>> from sets import Set
>>> longList = ['A', 'B', 'A', 'C', 'D', 'A', 'E', 'F', 'D']
>>> list(Set(longList))
['A', 'C', 'B', 'E', 'D', 'F']
Dookie
Da ja jetzt Python2.4 angesagt ist, geht es noch kürzer:
Code: Alles auswählen
Python 2.4 (#1, Dec 1 2004, 11:09:16)
[GCC 3.3.2 20031022 (Red Hat Linux 3.3.2-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> longList = ['A', 'B', 'A', 'C', 'D', 'A', 'E', 'F', 'D']
>>> print list(set(longList))
['A', 'C', 'B', 'E', 'D', 'F']
>>>
Verfasst: Dienstag 7. Dezember 2004, 21:49
von jens
Warum braucht man dazu v2.4 ???
Außerdem ist die Sortierung doch auch nicht wirklich richtig...
Verfasst: Dienstag 7. Dezember 2004, 21:58
von mawe
Hi!
jens hat geschrieben:
Warum braucht man dazu v2.4 ???
Na dann versuchs mal mit 2.3.
jens hat geschrieben:
Außerdem ist die Sortierung doch auch nicht wirklich richtig...
Hat keiner behauptet. Ist ja nur die 2.4-Version von Dookies Variante.
Gruß, mawe
Verfasst: Dienstag 7. Dezember 2004, 22:03
von fs111
jens hat geschrieben:Warum braucht man dazu v2.4 ???
Außerdem ist die Sortierung doch auch nicht wirklich richtig...
Weil sets jetzt in C implementiert sind und direkt über set() als builtin verfügbar sind.
fs111
Verfasst: Sonntag 12. Dezember 2004, 17:21
von Clython
Scheisse nochmal, ich muss noch viel lernen. Was ihr da in einer Zeile gebastelt habt, dafür brauchte ich so an die 10 oder so

Verfasst: Sonntag 12. Dezember 2004, 19:17
von Milan
*hehe*, das kommt schon noch

Die schönste und resourcenspaarenste ist die von Voges auf 2.4 übersetzt. Bei der bleibt dann die Sortierung auch erhalten, was sehr vorteilhaft sein kann. Deswegen nehm ich weder dicts noch sets (welche ja auch nur dicts mit speziellen Methoden sind)
Code: Alles auswählen
(item for (i,item) in enumerate(longList) if item not in longList[:i])
Dumm nur, das longList selbst kein Iterator sein kann, da die kein slicing unterstützen.
Verfasst: Sonntag 12. Dezember 2004, 19:29
von Clython
Tja mir ist im nachhinein aufgefallen, dass ich so dumm gar nicht bin, da mein Code die Liste flattet aber gleichzeitig auch das Vorkommen der einzelnen Tokens zählt (brauchte den Algorithmus für meinen Tokenizer). Hier mal der Code, Verbesserungsvorschläge gerne gesehen:
Code: Alles auswählen
def count_words(liste):
liste.sort()
current_pos = 0
first_pos = 0
out_liste = []
nr_liste = []
list_length = len(liste)
word = liste[current_pos]
while current_pos <= list_length:
if current_pos < list_length:
new_word = liste[current_pos]
if word != new_word:
last_pos = current_pos - 1
anzahl_vorkommen = last_pos - first_pos
out_liste.insert(0, word)
nr_liste.insert(0, [word, anzahl_vorkommen + 1])
first_pos = current_pos
word = liste[current_pos]
else:
last_pos = current_pos - 1
anzahl_vorkommen = last_pos - first_pos
out_liste.insert(0, word)
nr_liste.insert(0, [word, anzahl_vorkommen + 1])
current_pos = current_pos + 1
out_liste.reverse()
nr_liste.reverse()
return out_liste, nr_liste, list_length
Edit by Dookie: Code in Pythontags gesetzt
Verfasst: Sonntag 12. Dezember 2004, 19:51
von Dookie
hier mal meine Version, unter Einbeziehung vorhandener Lösungen.
Code: Alles auswählen
def count_words2(liste):
out_liste = [item for (i,item) in enumerate(liste) if item not in liste[:i]]
nr_liste = [[item, liste.count(item)] for item in out_liste]
list_length = len(liste)
return out_liste, nr_liste, list_length
Gruß
Dookie
Verfasst: Sonntag 12. Dezember 2004, 20:03
von joe
Auch wenn ich nicht ganz verstaqnden habe, was cpythons count_words leisten soll:
Code: Alles auswählen
def count_words3(liste):
wc = {}
for w in liste:
wc[w] = 1 + wc.get(w,0)
return wc.keys(),wc.items(),len(liste)
Das resultat ist zumindest sehr ähnlich.
joe
Verfasst: Sonntag 12. Dezember 2004, 20:16
von Dookie
ich hab auch noch eine Alternative, diesmal mit Set.
Code: Alles auswählen
from sets import Set # für Pythonversion < 2.4
def count_words3(liste):
nr_liste = [[item, liste.count(item)] for item in Set(liste)]
out_liste = [item for item, nr in nr_liste]
list_length = sum([nr for item, nr in nr_liste])
return out_liste, nr_liste, list_length
Gruß
Dookie