Seite 1 von 1

Problem: Unterschied PHP-Array und Python-Dictionary

Verfasst: Freitag 9. Dezember 2005, 00:48
von droptix
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'}

Re: Problem: Unterschied PHP-Array und Python-Dictionary

Verfasst: Freitag 9. Dezember 2005, 09:32
von lutz.horn
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.

Verfasst: Freitag 9. Dezember 2005, 10:04
von jens

Ah ja, das hilft

Verfasst: Freitag 9. Dezember 2005, 12:32
von droptix
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.

Begriff "Iteration"

Verfasst: Freitag 9. Dezember 2005, 12:34
von droptix
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.

Verfasst: Freitag 9. Dezember 2005, 12:36
von jens
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...

Re: Begriff "Iteration"

Verfasst: Freitag 9. Dezember 2005, 12:37
von jens
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