Erst mal Hallo an Alle

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
Fraser
User
Beiträge: 2
Registriert: Sonntag 23. März 2008, 11:05

Erst mal Hallo an Alle
Bin ganz neu im Python Programieren, rein aus eigener Initiative, also kein Schüler oder Student.
Deswegen bleibt mir nicht viel Auswahl, wo ich fragen könnte.

Ich lerne gerade aus dem Buch „A Byte of Python“. Meine erste Lektüre in Sachen Python. Bis jetzt war auch für mich alles verständlich und ich bin mit dem Material gut vorwärts gekommen. Nun in Kapitel 9 bin ich seit 3 Tagen ( mindestens 12std/Tag am googeln) hängengeblieben, Grund dafür ist, dass ich statt ae, ä verwendet habe.
So bin ich halt, ich mag nicht einfach abtippen.

Google habe ich als Freund, und wie gesagt seit drei Tagen bin ich nur noch am googeln. Habe eine Menge dazu gelernt, aber noch nicht ganz verstanden. Und deswegen bitte ich euch, mir auf den Sprung zu helfen.

Mein System ist Ubuntu UTF-8 wobei ich die Sache auch auf einem anderem Rechner mit XP ausprobiert habe, mit orginal dem gleichen Ergebnis.

Die Code ist:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

einkaufsliste = [ 'Äpfel', 'Mangos', 'Karotten', 'Bananen']  

print 'Ich habe',  len(einkaufsliste),  'Dinge einzukaufen.'   # Ab hier kommt das mit \xc3\x84pfel vor

print 'Diese Dinge sind:',   
for ding in einkaufsliste:
        print ding, 

print '\nIch muss auch Reis einkaufen.'   

einkaufsliste.append('Reis')
print 'Meine Einkaufsliste ist jetzt', einkaufsliste 

print 'Jetzt werde ich meine Einkaufsliste sortieren.'
einkaufsliste.sort()
print 'Die sortierte Einkaufsliste ist', einkaufsliste

print 'Zuerst werde ich', einkaufsliste[0],  'kaufen.'
altesding = einkaufsliste[0]
del einkaufsliste[0]
print 'Ich habe',  altesding,  'gekauft.'
print 'meine Einkaufsliste ist jetzt', einkaufsliste
Ausgabe:

Ich habe 4 Dinge einzukaufen.

Diese Dinge sind: Äpfel Mangos Karotten Bananen

Ich muss auch Reis einkaufen.

Meine Einkaufsliste ist jetzt ['\xc3\x84pfel', 'Mangos', 'Karotten', 'Bananen', 'Reis']

Jetzt werde ich meine Einkaufsliste sortieren.

Die sortierte Einkaufsliste ist ['Bananen', 'Karotten', 'Mangos', 'Reis', '\xc3\x84pfel']

Zuerst werde ich Bananen kaufen.

Ich habe Bananen gekauft.

meine Einkaufsliste ist jetzt ['Karotten', 'Mangos', 'Reis', '\xc3\x84pfel']


Es hat was mit encode utf-8 zu tun, aber wo oder wie soll ich weiter forschen, um die Listenausgabe als Umlaut zu bekommen? Sämtliche ( Sehr viele) Googlequellen habe ich bereits durchstudiert, um so mehr bin ich jetzt etwas verwirrt bei dem Thema. Ja es gibt etliches im Netz darüber zu lesen, habe ich auch eine ganze Zeit gemacht, aber wie kann ich das ganze jetzt in die Tat umsetzen? Kann mir jemand bitte einen Anstoss geben, in welche Richtung ich mich bewegen soll, um gewünschte Äpfel als Äpfel zu bekommen und nicht als \xc3\x84pfel?
Und warum wird am anfang Ä richtig encodet und in der Liste nicht mehr?
Heißt das, dass bevor die Liste erstellt wird, ist das Ä nicht codiert bzw. anders? Wo ist der Unterschied?
Mir ist es peinlich, dies zu fragen.
Im python.wiki beim Thema Listen gibt’s nichts mit Umlauten zu finden.
Ich weiß, dass hier im Forum das Thema Umlaute schon echt ergiebig diskutiert wurde und entschuldigt, dass ich damit schon wieder aufgefahren bin. Ging aber nicht anders.

Das die Liste jetzt anders sortiert ist,als gewünscht, ist mir verständlich und alle anderen Sachen habe ich auch verstanden.

Danke im voraus für Eure Hilfestellung. :)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Du solltest auf jeden Fall schon mal den Unicodetyp für Strings verwenden, also `u'Äpfel'` anstelle von `'Äpfel'`.

Dann möchte ich dir den %-Operator ans Herz legen. Aus

Code: Alles auswählen

print u'Ich habe',  altesding,  u'gekauft.'
wird dann

Code: Alles auswählen

print u'Ich habe %s gekauft.' % altesding
bzw. bei mehreren

Code: Alles auswählen

print u'Ich habe %s statt %s gekauft.' % (altesding, neuesding
`%s` steht dabei für einen String. Entgegen der Komma-Syntax von `print` kannst du über diese Formatierung allerdings keine Objekte direkt darstellen (indirekt wird die Methode `repr()` darauf aufgerufen - oder war es `str()`?). Ohnehin hübscher ist es aber, die Liste in einen String mit Trennzeichen umzuwandeln:

Code: Alles auswählen

print u'Meine Einkaufsliste ist jetzt: %s', ', '.join(einkaufsliste)
BlackJack

In Listen sind die Zeichenketten, also eigentlich Byteketten, genau so kodiert wie ausserhalb. Der Unterschied ist, dass bei der Darstellung einer Liste als Zeichenkette die enthaltenen Objekte nicht danach gefragt werden, wie sie als Zeichenketten aussehen, sondern ihre `repr()`-Darstellung genommen wird.

Der Grund ist, damit die Listendarstellung eindeutig ist, man also *genau* sieht, was dort enthalten ist. Das möglichst auch bei jeder Kodierung des Ausgabekanals, also wird bei Zeichenketten alles was sich nicht im ASCII-Bereich befindet als '\x??'-Sequenz ausgegeben.

Listen sind nicht wirklich als Ausgabeform für Endbenutzer gedacht. Die Darstellung als Zeichenkette ist darauf ausgelegt, um die Fehlersuche zu ermöglichen.
Fraser
User
Beiträge: 2
Registriert: Sonntag 23. März 2008, 11:05

Super, vielen Dank Euch beiden, Ihr habt mir echt weiter geholfen. Ich werde Euch bestimmt noch öfters neven ;-)

LG Fraser
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Y0Gi hat geschrieben: `%s` steht dabei für einen String. Entgegen der Komma-Syntax von `print` kannst du über diese Formatierung allerdings keine Objekte direkt darstellen (indirekt wird die Methode `repr()` darauf aufgerufen - oder war es `str()`?)
print und %s rufen str() auf. %r ruft repr() auf.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

birkenfeld hat geschrieben:print und %s rufen str() auf. %r ruft repr() auf.
%s ruft unicode() auf wenns in einem Unicode String ist.
TUFKAB – the user formerly known as blackbird
Antworten