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 :D

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 :wink: ):

Code: Alles auswählen

[l[i] for i in xrange(len(l)) if l[i] not in l[:i]]

Verfasst: Donnerstag 9. Oktober 2003, 12:14
von Beyond
:D

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 :oops:

Verfasst: Sonntag 12. Dezember 2004, 19:17
von Milan
*hehe*, das kommt schon noch :wink: 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