Vokal-Laute 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.
Antworten
didi27
User
Beiträge: 6
Registriert: Freitag 29. September 2017, 15:23

Hallo,

Ich frage mich wie man die Vokal-Laute aus einem Wort entfernt. I'm stuck. Pls Help ME. This is my Code:

def disemvowel(word):
____vowels = ('a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U')
____for vowel in vowels:
________word.remove(vowel)
____print(word)

disemvowel('aeiouAeioukjhdfsdfjfaeiofdfkjhsdf')

Das ist eine Aufgabe von Treehouse. Ich brauche also nur ein paar Tipps. Damit ich noch was egenständig tun kann.
Zuletzt geändert von didi27 am Freitag 29. September 2017, 15:50, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Statt Unterstrichen einfach das Code-Feature hier im Editor verwenden.

Und zu deinem Problem: auch wenn es nicht gerade vor Effizienz strotzt, bist du schon fast da. Nur gibt es halt kein remove auf Strings. Es gibt aber replace.

https://docs.python.org/3/library/stdty ... tr.replace

Deinen Vokal mit einem Leerstring zu ersetzen sollte dich weiterbringen. Aber Achtung: strings in Python sind unveraenderlich! Dem musst du Rechnung tragen.
didi27
User
Beiträge: 6
Registriert: Freitag 29. September 2017, 15:23

__deets__ hat geschrieben:Statt Unterstrichen einfach das Code-Feature hier im Editor verwenden.

Und zu deinem Problem: auch wenn es nicht gerade vor Effizienz strotzt, bist du schon fast da. Nur gibt es halt kein remove auf Strings. Es gibt aber replace.

https://docs.python.org/3/library/stdty ... tr.replace

Deinen Vokal mit einem Leerstring zu ersetzen sollte dich weiterbringen. Aber Achtung: strings in Python sind unveraenderlich! Dem musst du Rechnung tragen.
Also Danke erstmal für den Tipp. So sieht mein Code aus der noch nicht das erfüllt was ich erwarte:

Code: Alles auswählen

def disemvowel(word):
    try:
        vowels = ['a','A','e','E','i','I','o','O','u','U']
        for vowel in vowels:
            word.replace(vowel,'')
        return word
    except ValueError:
        pass
noch ein paar tipps?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso hast du denn den ValueError? Das klingt nach daneben programmiert. Das muss also raus, und die Ursache repariert werden.

Und nochmal: strings in Python sind unveraenderlich. replace veraendert also nicht den string, so wie du es erwartest. Sondern liefert den veraenderten string zurueck. Den musst du dann also weiterverwenden, indem du ihn word wieder zuweist.
didi27
User
Beiträge: 6
Registriert: Freitag 29. September 2017, 15:23

__deets__ hat geschrieben:Wieso hast du denn den ValueError? Das klingt nach daneben programmiert. Das muss also raus, und die Ursache repariert werden.

Und nochmal: strings in Python sind unveraenderlich. replace veraendert also nicht den string, so wie du es erwartest. Sondern liefert den veraenderten string zurueck. Den musst du dann also weiterverwenden, indem du ihn word wieder zuweist.
Jaaa Danke für die Hilfe! Es hat geklappt! einfach word den neuen Wert zuweisen:

Code: Alles auswählen

def disemvowel(word):
	vowels = ['a','A','e','E','i','I','o','O','u','U']
	for vowel in vowels:
		word = word.replace(vowel,'')
	return word
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man kann auch translate() benutzen:

Code: Alles auswählen

#!/usr/bin/env python3

def delete_chars(characters, text):
    charmap = dict.fromkeys(characters)
    table = str.maketrans(charmap)
    return text.translate(table)

def delete_vowels(text):
    vowels = 'aeiou'
    vowels += vowels.upper()
    return delete_chars(vowels, text)

def main():
    text = 'aeiouAeioukjhdfsdfjfaeiofdfkjhsdf'
    print(delete_vowels(text))

if __name__ == '__main__':
    main() 
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und hier nochmal mit einem Cache, wobei ich maketrans() einfach nachgebaut habe:

Code: Alles auswählen

#!/usr/bin/env python3

_CACHE = {}

def delete_chars(characters, text):
    if characters not in _CACHE:
        _CACHE[characters] = dict.fromkeys(map(ord, characters))
    return text.translate(_CACHE[characters])

def delete_vowels(text):
    vowels = 'aeiou'
    vowels += vowels.upper()
    return delete_chars(vowels, text)

def main():
    text = 'aeiouAeioukjhdfsdfjfaeiofdfkjhsdf'
    print(delete_vowels(text))

if __name__ == '__main__':
    main() 
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Das ganze jetzt mal funktional als Einzeiler:

[codebox=pycon file=Unbenannt.txt]>>> ''.join(filter(lambda x: x not in 'aeiouAEIOU', 'Hello, World!'))
'Hll, Wrld!'
[/code]
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oder ohne Lambda:

Code: Alles auswählen

vowels = set('aAeEiIoOuU')
''.join(char for char in text if char not in vowels)
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Und ohne filter sowie die Vokale als Menge. Besser kann es nicht mehr werden ;)
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, für längere Texte, die sich im ASCII-Bereich bewegen (also z.B. ohne Umlaute und ohne ß) würde ich schon lieber translate() benutzen, auch wenn die Schnittstelle relativ lowlevel ist.
didi27
User
Beiträge: 6
Registriert: Freitag 29. September 2017, 15:23

Wow so viele verschiedene Lösungen! :o
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Oder ohne `for`:

Code: Alles auswählen

''.join(filter(set('aeiouAEIOU').isdisjoint, text))
Antworten