Problem: Unterschied PHP-Array und Python-Dictionary

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Freitag 9. Dezember 2005, 00:48

Wenn ich in PHP ein assoziatives Array erzeuge und nach und nach Elemente hinzufüge, dann behalten alle ihre Reihenfolge in genau der Form, wie sie ursprünglich eingefügt wurden. Python hingegen merkt sich nicht, welches Element zuerst eingefügt wurde. Bereits nach ein paar Elementen bringt mir Python die Reihenfolge meines Dictionaries durcheinander. Zuerst dachte ich, dass Python nach den Schlüsseln sortiert. Aber das scheint nicht so zu sein. In diesem Beispiel sieht es so aus, als würde Python in umgekehrter Reihenfolge nach den Werten sortieren. Das variiert natürlich stark je nach Schlüsselnamen und Werten, aber ich komme nicht dahinter.

Ich möchte aber keine Sortierung, wenn ich neue Elemente mit myDict.append(myValue) anfüge. Vielmehr würde es mir nützen, wenn Python die Reihenfolge genau so behält, wie die Elemente nacheinander angefügt wurden. Wie erreiche ich das?

Ein Beispiel für ein PHP-Array:

Code: Alles auswählen

<?php
$a = array ("a" => "pear", "b" => "apple", "c" => "orange");
print_r ($a);
?>
Ergibt:

Code: Alles auswählen

Array
(
    [a] => pear
    [b] => apple
    [c] => orange
)
Ein Beispiel für ein Python-Dictionary:

Code: Alles auswählen

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

a = {"a": "pear", "b": "apple", "c": "orange"}
print a
Ergibt:

Code: Alles auswählen

{'a': 'pear', 'c': 'orange', 'b': 'apple'}
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Freitag 9. Dezember 2005, 09:32

droptix hat geschrieben:Vielmehr würde es mir nützen, wenn Python die Reihenfolge genau so behält, wie die Elemente nacheinander angefügt wurden. Wie erreiche ich das?
Ein Dictionary ist immer unsortiert. Jede Reihenfolge, die sich beim Iterieren über es ergibt, ist rein zufällig (fast).

Du kannst aber eine ein "Ordered Dictionary" verwenden, wie es z.B. hier beschrieben wird.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 9. Dezember 2005, 10:04


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Freitag 9. Dezember 2005, 12:32

Sehr fein! Obwohl ich mich schon frage, weshalb Python die Werte durcheinander bringt. Es macht schon Sinn, die Reihenfolge beizubehalten.

Welche Methode haltet ihr für sinnvoller? Bei dem Link von lutz.horn wird UserDict (kenne ich gar nicht) modifiziert und in den sechs Kommentaren werden schon die ersten Bugs besprochen. Bei dem Link von jens wird das dict Objekt modifiziert, was eigentlich mehr Sinn macht, oder? Aber dort muss ich wahrscheinlich die Methoden myLict.iteritems() und myLict.itervalues() verwenden, um die Werte in "richtiger" Reihenfolge zu bekommen. Was ja eigentlich eine sinnvolle Erweiterung gegenüber dem Überschreiben der Methoden items() und values() ist.

Was meint ihr? Ich kann den Aufbau von odict() nachvollziehen, dafür den von Lict() leider nicht ganz. Dazu reichen meine Python-Kenntnisse noch nicht.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Freitag 9. Dezember 2005, 12:34

Was heißt eigentlich "iterieren"? In Englisch-Deutsch Wörterbüchern finde ich "iterate" nicht. Bei http://duden.de/ schon... Es muss was mit Wiederholungen zu tun haben.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 9. Dezember 2005, 12:36

Der Sinn dahinter, das ein Dict die Reihenfolge nicht beibehält, bzw. zusätzlich speichert, liegt darin, das Python den Zugriff optimiert, damit man über den Key sehr schnell an die values kommt.

Es wird nicht das dict Objekt generell Modifiziert, sondern die Lict-Klasse erbt von dict...
Du kannst im prinzip die Lict-Klasse genauso wie ein dict benutzten. Unter nach "if __name__=="__main__":" ist auch quasi ein Beispiel dabei... Speicher das Skript einfach mal bei dir und führe es aus...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 9. Dezember 2005, 12:37

droptix hat geschrieben:Was heißt eigentlich "iterieren"? In Englisch-Deutsch Wörterbüchern finde ich "iterate" nicht. Bei http://duden.de/ schon... Es muss was mit Wiederholungen zu tun haben.
Deswegen hab ich die Wiki Seite angelegt: http://pythonwiki.pocoo.org/Allgemeine_Begriffe

EDIT: Ach, und ein Tipp: http://dict.leo.org/?lang=de

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten