Seite 1 von 2

komisches iterations Ergebnis

Verfasst: Dienstag 2. März 2010, 15:04
von .exe
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

Re: komisches iterations Ergebnis

Verfasst: Dienstag 2. März 2010, 15:21
von /me
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 ...

Verfasst: Dienstag 2. März 2010, 15:25
von derdon
Ich tippe auf 4.0 :lol:

Verfasst: Dienstag 2. März 2010, 15:34
von DasIch
Wenn 4.0 so aussieht wechsel ich zu Ruby.

Verfasst: Dienstag 2. März 2010, 15:38
von .exe
Ruby mag doch eh keiner :wink:

Nein ich habe Python 2.5.4 im einsatz.
Result ist eine Rückgabe-Objekt von einem WebService

Verfasst: Dienstag 2. März 2010, 15:48
von /me
.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.

Verfasst: Dienstag 2. März 2010, 17:16
von derdon
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"...

Verfasst: Dienstag 2. März 2010, 18:16
von 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?

Verfasst: Dienstag 2. März 2010, 18:23
von derdon
Ich zeige, wie ich Python gerne hätte.

Verfasst: Dienstag 2. März 2010, 18:36
von snafu
derdon hat geschrieben:Ich zeige, wie ich Python gerne hätte.
Unlogisch und inkonsistent also. :)

Verfasst: Dienstag 2. März 2010, 19:21
von DasIch
Was heisst unlogisch, Python braucht pattern matching :twisted:

Verfasst: Dienstag 2. März 2010, 19:49
von Ronnie
DasIch hat geschrieben:Was heisst unlogisch, Python braucht pattern matching :twisted:
Pattern-Matching klingt gut. Habe es mal bei F# gesehen und war beeindruckt.

Verfasst: Dienstag 2. März 2010, 20:58
von Darii
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.

Verfasst: Dienstag 2. März 2010, 21:48
von derdon
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.

Verfasst: Dienstag 2. März 2010, 22:10
von Darii
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.

Verfasst: Dienstag 2. März 2010, 22:13
von jbs
Was spricht denn gegen .items?

Verfasst: Dienstag 2. März 2010, 22:13
von /me
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.

Verfasst: Dienstag 2. März 2010, 22:17
von derdon
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.

Verfasst: Dienstag 2. März 2010, 22:24
von Darii
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.

Verfasst: Dienstag 2. März 2010, 22:26
von /me
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.