Buchstaben einer Liste größer/kleiner schreiben?

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
gogoAustria
User
Beiträge: 2
Registriert: Donnerstag 14. April 2016, 17:35

Ich soll ein Programm programmieren, wo die einzelnen Elemente der Liste behandelt werden, und jeder einzelne Buchstabe der Elemente groß geschrieben wird bei der Ausgabe der Eingangs klein war, und andersrum. Sonderzeichen und Zahlen innerhalb der Woerter sollen unverändert uebernommen werden. Die urspruengliche Liste soll nicht veraendert.


Ich nenne die Fkt mal 'VertauscheSchreibweise(Liste)', diese bekommt als Parameter eine Liste von Strings übergeben.
Ich möchte dann die 'neueListe' (nennen wirs auch gleich so) ausgeben.

Nach Nachrage soll das dann etwa am Schluss so funktionieren:
Liste = ['ZWei2','DreI','SieBen', 'Dreizehn']
print VertauscheSchreibweise(Liste)
-> Ausgabe: ['zwEI2', 'dREi', 'sIEbEN', 'dREIZEHN']

Ich stehe aber nun komplett am Schlauch. Wie soll ich einen kompakten Code programmieren, der alle Buchstaben "umdreht"?
Jedes einzelne Element der Liste groß machen, oder eben klein machen, sollte kein Problem sein. (mit ".upper" und ".lower")
Aber dann innerhalb der Listenelemente noch unterschiedlich groß/klein zu machen, kann ich beim besten Willen nicht.

Wie gehe ich da vor?
Ohne dass ich mir die arbeit abnehmen lassen möchte, aber bitte erklärt mir das ganze anhand von vollständigen Codes, sonst wirds schwierig für mich das ganze nachzuvollziehen.

PS.: Ich habe den "offenen Brief" gelesen, ich hoffe meine Anfrage kommt nicht dreist rüber. Ich hab wirklich versucht mir Gedanken zu machen, bin auch sonst nicht so übel im Prorgrammieren.

Aber das ganze in einer Liste zu machen schaff ich einfach nicht.

Ich bitte um Hilfe!
BlackJack

@gogoAustria: Zerlege das Problem in kleinere Teilprobleme. Und für die Teilprobleme kannst Du dann jeweils eine Funktion schreiben die das löst. Testen, und dann zur nächsten Teillösung weitergehen.

Die Buchstaben in einer Liste von Zeichenketten ”umdrehen” kann man runterbrechen auf eine Funktion welche die Buchstaben in *einer* Zeichenkette ”umdreht”. So eine Funktion kann man dann auf jedes Element der Liste anwenden. Sehr praktisch ist in solchen Fällen die `map()`-Funktion oder eine „list comprehension“.

Bei der Funktion für eine Zeichenkette kann man genau so vorgehen. Zeichenkette ”umdrehen” bedeutet ja jedes einzelne Zeichen ”umdrehen”. Wäre praktisch wenn man dafür eine Funktion hätte, die man dann auf die einzelnen Zeichen anwenden könnte. Zum Beispiel mittels der `map()`-Funktion oder eines Generatorausdrucks.

Zum ”umdrehen” eines Zeichens schau Dir mal die Methoden an die auf Zeichenketten definiert sind. Vorgehen für `zeichen_umdrehen(zeichen)` wäre allgemein Falls Zeichen klein ist, in gross umwandeln, falls Zeichen gross ist, in klein umwandeln, sonst unverändert zurückgeben. Das kann man fast wörtlich in Python-Quelltext umformulieren.
gogoAustria
User
Beiträge: 2
Registriert: Donnerstag 14. April 2016, 17:35

Danke für die Rückmeldung!

Mir fehlt schon alleine der Befehl zu prüfen ob der Buchstabe groß oder klein ist.
Muss ich das über Umwege machen? (Also zuerst alles groß machen, und dann einen "vorher-nacher" vergleich machen, und nachsehen, an welchen Stellen die Buchstaben sich (hinsitchlich groß/klein) geändert haben?)

So grob die Schleife hab ich mal, damit kann ich jedes Element der Liste extrahieren, egal wie viele Elemente die Liste hat.
Liste = ['ZWei2','DreI','SieBen', 'Dreizehn'] #--> Eingabe
for l in Liste:
print(l.lower())

Nun prüfe ich für jedes "l", (also für jedes Element), wie lang das element ist (also wie viele Stellen es hat).
Dementsprechend mach ich dann eine neue Schleife, die alle Stellen durchgeht und die groß/kleinschreibung verdreht, bis es eben am Ende des Elementes (also des Wortes) angekommen ist. (wie ich das anstelle weiß ich noch nicht, das ist aber greifbar)

Wenn es keine "l's" mehr gibt, endet die Schleife, da ja dann auch meine Liste zu Ende ist.

Innerhalb der Schleife erstelle ich noch eine Liste, in der jeder umgedrehte Begriff reinkommt, und dann am Schluss ausgegeben wird.


Leider weiß ich nun beim besten Willen nicht wie ich das anstellen soll. In meinem Kopf läuft es, aber niederschreiben kann ichs nicht...
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

gogoAustria hat geschrieben:Danke für die Rückmeldung!

Mir fehlt schon alleine der Befehl zu prüfen ob der Buchstabe groß oder klein ist.
Du findest in der Dokumentation zur Python Standard Library unter "4.7 Text Sequence Type - str" den Abschnitt "String Methods" und darin neben den Methoden, die einen gegebenen String klein oder groß machen (s.upper(), s.lower(), die kennst Du ja schon) auch Methoden, die abfragen, ob er komplett groß oder komplett klein geschrieben ist. Hinweis zum leichteren Finden: derlei Abfragemethoden haben normalerweise Namen, die mit is... anfangen.

Und was Dir möglicherweise nicht so klar ist: alle diese Methoden lassen sich genau so gut auf Einzelzeichen anwenden. Im Gegensatz zu anderen Programmiersprachen macht Python sowieso keinen Unterschied zwischen Zeichenketten und Einzelzeichen. Und ein Wort in Deiner Liste kannst Du hier einfach wie eine Liste von Einzelzeichen behandeln. Also, wenn wir für den Anfang bei ordinären Schleifen bleiben:
So grob die Schleife hab ich mal, damit kann ich jedes Element der Liste extrahieren, egal wie viele Elemente die Liste hat.
Liste = ['ZWei2','DreI','SieBen', 'Dreizehn'] #--> Eingabe

Code: Alles auswählen

neueliste = []
for wort in Liste:
	neuwort = []
	for zeichen in wort:
		# wenn zeichen klein, dann hänge zeichen.upper() an neuwort
		# sonst wenn zeichen groß, dann ... - klar?
		# sonst soll es bleiben, wie es ist, aber etwas muss trotzdem passieren
	# jetzt noch aus der Zeichen-Liste neuwort eine Zeichenkette machen und die an neueliste anhängen
# Am Ende die neue Liste zurückgeben.
Selbstverständlich geht das eleganter (die schon genannten Stichworte map und list comprehension), aber das wäre mal eine schlichte Grundstruktur für das Problem. Verschönern kannst Du auch im zweiten Schritt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie BlackJack schon schrieb, solltest Du mit einer Funktion für *ein* Zeichen beginnen! Eine dafür notwendige Operation findest Du hier: https://docs.python.org/3/library/stdty ... tr.islower

Den Rest findest Du dann sicherlich auch ohne speziellen Link ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man könnte auch einfach `str.swapcase()` benutzen:

Code: Alles auswählen

print('hALLO'.swapcase())  # -> Hallo
Oder auf das Beispiel angewendet:

Code: Alles auswählen

words = ['ZWei2','DreI','SieBen', 'Dreizehn']
swapped_words = [word.swapcase() for word in words]
print(swapped_words)  # -> ['zwEI2', 'dREi', 'sIEbEN', 'dREIZEHN']
...aber vermutlich ist die Idee der Aufgabe, es zu Fuß zu machen.
Antworten