komisches iterations Ergebnis

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.
.exe
User
Beiträge: 27
Registriert: Mittwoch 14. Januar 2009, 11:16

Hi @ all,

ich habe da mal ne frage und zwar habe ich nen liste die wie folgt aufgebaut ist:

Code: Alles auswählen


result= [(name){
                          info1  = ""
                          info2 = "xy"
                          info3 = "Text" 
                         },
              (name2){
                          info1  = ""
                          info2 = "xy"
                          info3 = "Text" 
                         }
            ]
Ich versuche nun die werte aus den einzelenen Dictionaris auszulesen.
Wenn ich jetzt über die Liste Iteriere bekomme ich ein komische ergebnis und weiss nicht warum.

Code: Alles auswählen

for dicts in result:
     for wert in dicts:
          print wert
Der Print befehl dienen nur zur anzeige was er Iteriert.
Ergebnis des ganzen ist.

Code: Alles auswählen

info1  
info2 
info3 
Aber warum gibt der nicht die kompletten Zeilen aus sondern immer nur die ersten wörter. Ich versteh das nicht ganz.
Ich hoffe ihr könnt mir Helfen.

Gruß

.exe
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Eine Rückfrage hätte ich: Welche Python-Version setzt du ein?

Edit: Ich kann für ein aktuelles Python 2.6.x problemlos den Dokumentationsvorlesedienst spielen und erklären warum das angezeigt wird was angezeigt wird und was man machen müsste um es anders zu haben. Bei dem Codebeispiel handelt es sich allerdings um eine Syntax die mir bisher von Python nicht vertraut ist ...
Zuletzt geändert von /me am Dienstag 2. März 2010, 15:35, insgesamt 2-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich tippe auf 4.0 :lol:
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Wenn 4.0 so aussieht wechsel ich zu Ruby.
.exe
User
Beiträge: 27
Registriert: Mittwoch 14. Januar 2009, 11:16

Ruby mag doch eh keiner :wink:

Nein ich habe Python 2.5.4 im einsatz.
Result ist eine Rückgabe-Objekt von einem WebService
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

.exe hat geschrieben: Nein ich habe Python 2.5.4 im einsatz.
Result ist eine Rückgabe-Objekt von einem WebService
SyntaxError: invalid syntax

Warum machst du denen die dir helfen wollen die Arbeit schwerer? Für die Initialisierung der Datenstruktur solltest du wirklich funktionierenden Code angeben. Mit dem Verhau da kann man nur raten wie die Struktur sein soll.

Grundsätzlich solltest du dir aber klar machen, wie der von dir geschriebene Code mit Dictionaries umgeht. Lies mal http://docs.python.org/tutorial/datastr ... ctionaries und widme - nachdem du verstanden hast was passiert - der Methode iteritems() deine Aufmerksamkeit.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich würde es schön finden, wenn folgendes möglich wäre, d.h. dass automatisch ausgepackt wird:

Code: Alles auswählen

>>> carl = {'name': 'Carl', 'age': 56}
>>> for name, age in carl:
...     print name, age
... 
age 56
name Carl
>>> for name in carl:
...     print name
... 
age
name
Aber es gilt ja (leider) "explicit is better than implicit"...
BlackJack

@derdon: Ich bin verwirrt. Zeigst Du da wie es sich Deiner Meinung nach verhalten sollte, oder wie es sich tatsächlich verhält? Ich tippe mal auf letzteres, aber dann wüsste ich gerne mal was das machen soll?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich zeige, wie ich Python gerne hätte.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

derdon hat geschrieben:Ich zeige, wie ich Python gerne hätte.
Unlogisch und inkonsistent also. :)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Was heisst unlogisch, Python braucht pattern matching :twisted:
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

DasIch hat geschrieben:Was heisst unlogisch, Python braucht pattern matching :twisted:
Pattern-Matching klingt gut. Habe es mal bei F# gesehen und war beeindruckt.
Achtung: User ist ein Python-Lehrling!
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

derdon hat geschrieben:Aber es gilt ja (leider) "explicit is better than implicit"...
Das hat damit nichts zu tun. Python iteriert bei dicts nunmal standardmäßig über die Schlüssel. Punkt aus.

Demensprechend funktioniert „for a, b in dict“ auch, wenn die Schlüssel Tupel sind, was durchaus zulässig ist. Es wäre mehr als willkürlich wenn Python beim Iterieren über dicts, wenn man 2-Tupel auspackt, nicht über die Schlüssel, sondern über die Schlüssel-Wert Tupel iterieren würde. Und ansonsten wieder normal über die Keys.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Darii hat geschrieben:Python iteriert bei dicts nunmal standardmäßig über die Schlüssel. Punkt aus.
Und das gefällt mir nun mal nicht. Punkt aus. Meine Vorstellung kommt mir nicht willkürlich vor, aber vielleicht kannst du ja ein Codeschnipsel zeigen, damit ich dich besser verstehen kann.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

derdon hat geschrieben:Und das gefällt mir nun mal nicht. Punkt aus. Meine Vorstellung kommt mir nicht willkürlich vor, aber vielleicht kannst du ja ein Codeschnipsel zeigen, damit ich dich besser verstehen kann.
Du willst:

Code: Alles auswählen

dict3 = { "abc": 1, "def": 2 }
for a in dict3:
    print a
for a, b in dict3:
    print a, b
for a, b, c in dict3:
    print a, b, c
# ----- #
abc
def
abc 1
def 2
a b c
d e f
Sprich, wenn man 2-tupel entpacken will, soll Python von dem üblichen Schema abweichen und *nicht* über die Schlüssel, sondern über die Schlüssel und Werte iterieren. Und was ist bei allgemeinen Iteratoren? D.h. Python soll bei for zusätzlich noch zwischen dicts und dem Rest unterscheiden? Was du willst erreicht man mit dict.items ohne irgendwelche Sonderregeln einzurichten.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Was spricht denn gegen .items?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

derdon hat geschrieben:Ich zeige, wie ich Python gerne hätte.
Schreib dir doch ein dondict das sich genau so verhält. Das sind doch nur ein paar Zeilen Code und schon bekommst du statt jetzt

Code: Alles auswählen

foo = {("a", "b"): "c", ("x", "y"): "z"}
for bar, baz in foo:
    print bar, baz

a b
x y
als Ergebnis

Code: Alles auswählen

("a", "b") c
("x", "y") z
oder so ähnlich.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Darii: Bei Zeile 6 soll eine Exception (TypeError oder SyntaxError, ka) geworfen werden,weil nur ein oder zwei Namen erlaubt sind. Es soll automatisch erkannt werden, ob man nur über die keys (d.h. ein Name zwischen `for` und `in`) oder über key und value iterieren möchte (d.h. sowas wie `for a,b in ...`). Im letzteren Fall soll "hinter den Kulissen" auf dict.iteritems() umgeschaltet werden.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

derdon hat geschrieben:Darii: Bei Zeile 6 soll eine Exception (TypeError oder SyntaxError, ka) geworfen werden,weil nur ein oder zwei Namen erlaubt sind.
Warum auf unpacking in for-Schleifen verzichten? Nur damit ich mir bei dicts ein .items() sparen kann? Schlechter Tausch.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

derdon hat geschrieben:Es soll automatisch erkannt werden, ob man nur über die keys (d.h. ein Name zwischen `for` und `in`) oder über key und value iterieren möchte (d.h. sowas wie `for a,b in ...`). Im letzteren Fall soll "hinter den Kulissen" auf dict.iteritems() umgeschaltet werden.
Och nööö, bitte keine Magie in Python.
Antworten