Seite 1 von 1

Doppelte Zeichen aus Zeichenkette löschen.[solved]

Verfasst: Montag 26. Juni 2006, 20:38
von icepacker
Hi
Das Problem hat sich als etwas schwieriger erwiesen, als zunächst gedacht :?
Deswegen frage ich jetzt mal hier im Forum nach.
Ich will einfach alle doppelten Zeichen aus einem String löschen. Gibts da vielleicht schon eine Built-in Funktion?
Zum Beispiel:

Code: Alles auswählen

>>delete_doubles('hallokila')
>> 'haloki'
Das Problem was sich mir gestellt hatte war, dass man die Sequenz (hier ein String) über die iteriert wird, ja bekanntermaßen nicht verändern kann.
Also hab ich eine Kopie genommen und daraus die Doppelten gelöscht.
Leider sind dann die Positionen verrutscht. Ansätze sahen zB so aus:

Code: Alles auswählen

def delete_doubles( string ):
	new_string = string
	for pos, char in enumerate( string ):
		if new_string.count( char ) > 1:
			new_string = string[:pos] + string[pos+1:]
	return new_string
Ich hoffe ihr könnt mir helfen. Danke!

lg icepacker

Verfasst: Montag 26. Juni 2006, 20:44
von murph
ich glaub du meisnt was anderes an einer stelle:
>>delete_doubles('hallokila')
>>'halokila'
anstelle vom löschen von 'la' noch am ende.
richtig? sonst verwirrt mich das...

Verfasst: Montag 26. Juni 2006, 20:52
von icepacker
Hi
Ich habe jetzt eine Möglichkeit gefunden:

Code: Alles auswählen

def delete_doubles( string ):
	new_string = ''
	string = list( set( list( string ) ) )
	for item in string:
		new_string += item
	return new_string
Leider verlieren die Zeichen hier ihre ursprüngliche Reihenfolge.
Gibts also noch weitere Lösungen in denen die Reihenfolge beibehalten wird?

EDIT:
Mist jetzt bin ich verwirrt. Ich glaub ich muss grad selbst nochmal überlegen, was ich jetzt nochmal brauche.
Also ob einfach nicht zwei gleiche Zeichen hintereinander folgen dürfen oder ob im ganzen String keine Zeichen mehrmals vorkomment dürfen.
Wie gesagt, da muss ich gerade nochmal nachdenken :oops: :?

Verfasst: Montag 26. Juni 2006, 20:54
von murph
kannst du das sonst in einem dic ablegen?
dann wäre das einfacher. sprich: würd ich machen :-)

Verfasst: Montag 26. Juni 2006, 21:06
von mawe
Hi!

Also wenn Du einfach hintereinander liegende Doppelte löschen willst, wäre vielleicht das eine Möglichkeit:

Code: Alles auswählen

import re

s = "halllllooooo"
new = re.sub(r"(.)\1+", r"\1", s)
Gruß, mawe

Verfasst: Montag 26. Juni 2006, 21:07
von icepacker
lol sorry Leute war grad echt etwas daneben...
Aber war irgendwie die ganze Zeit auf dem falschen Dampfer :roll:
Ich suchte, glaube ich^^, einfach folgendes:

Code: Alles auswählen

In [56]: string = 'hallokila'

In [57]: new = ''

In [58]: for i in string:
   ....:     if i not in new:
   ....:         new += i
   ....:

In [59]: new
Out[59]: 'haloki'

Verfasst: Montag 26. Juni 2006, 21:16
von murph
aber mit welchem sinn wird "la" am ende gelöscht?
das ist nicht doppelt... o0

Verfasst: Montag 26. Juni 2006, 21:23
von mawe
murph, ich schätze mal, er will dass in dem Wort jeder Buchstabe nur einmal vorkommt.

Verfasst: Montag 26. Juni 2006, 21:24
von icepacker
Das Problem war die Zeichenkette so zu verändern, dass alle Zeichen einzigartig sind bzw. nur einmal vorkommen.

lg icepacker

Verfasst: Dienstag 27. Juni 2006, 18:04
von murph
achso...hab halt nur aufeinanderfolgende darunter verstanden, aber weils nun solved is, isses auch egal.