Seite 1 von 1

Vergleich von Keys aus Dict mit Variablen + Bedingung

Verfasst: Dienstag 2. Juni 2009, 17:52
von PhantomWorks
Hallo miteinander!

Nachdem ich das XML zu CSV Problem nun halbwegs in den Griff bekommen habe, würde ich Euch bitten mir bei einer weiteren Schwierigkeit zu helfen, die sich heute aufgetan hat:

Ausgang: 2 aus einer Schleife heraus generierte Dictionaries
Dazu gleich eine Frage: Was ist grundsätzlich besser, ein einziges, großes Dictionary mit lauter durch ein Komma voneinander getrennten Schlüssel:Wert Paaren zu haben {Schlüssel1:Wert1, Schlüssel2:Wert2,...}
, oder ein großes Dictionary das aus vielen einzelnen Dicts der Form {{Schlüssel1:Wert1},{Schlüssel1:Wert1},...} ? Oder ist es noch besser eine Liste aus Einzel-Dictionaries [{Schlüssel1:Wert1}, {Schlüssel2:Wert2},...] zu erzeugen?

Bei mir nun folgende Konstellation:

Es existiert eine for-Schleife die über eine XML-Datei läuft, dort ein bestimmtes Tagattribut ausliest und in einer Variablen TagAttribut speichert. Bei jedem neuen Durchgang wird der alte Wert der Variablen also überschrieben.
Daneben existiert folgendes Dict, das aus einer anderen Datei erzeugt wird:

Code: Alles auswählen

Dict1 = {Key1:Value1,Key2:Value2,Key3:Value3}
Wie gesagt: Wenn ihr mir sagt es sei eine Liste aus lauter Einzel-Dicts oder ein großes Dict aus lauter kleinen Dicts besser, so ist dies machbar.

Mein Ziel ist es nun, bei jedem Durchlauf der for-Schleife zu prüfen, ob die Variable TagAttribut als Key in Dict1 vorhanden ist.

Wenn JA (vorhanden) --> Value des betreffenden Keys aus dem Dict in neuer Variable XYZ speichern. Diese Variable wird dann später, aber noch immer in der for-Schleife, in das Dictionary myDict geschrieben. Danach wird die for-Schleife erneut durchlaufen usw.. Nach jedem Durchlauf wird myDict in die Liste myList geschrieben.

Wenn NEIN --> Variable XYZ bleibt leer.

Mein Problem ist es nun die Variable TagAttribut mit den Keys derart zu vergleichen, dass ich bei einem Matching den Value des betreffenden Keys in XYZ speichern kann.

Vielen Dank für Eure Tipps!!

Verfasst: Dienstag 2. Juni 2009, 18:25
von BlackJack
Also mir ist die Beschreibung ein wenig zu abstrakt und auch zu unpräzise.

Du solltest Dich selber noch einmal mit Dictionaries und Listen auseinandersetzen. Die zweite Variante ist so überhaupt nicht möglich, weil man in einem Dictionary immer Schlüssel/Wert-Paare speichert und nicht *nur* Werte. Nur das erste macht Sinn, wenn die Dictionaries sonst wirklich nur immer einen Schlüssel und einen Wert enthalten würden, wie in der Liste bei der dritten Variante.

Vielleicht hantierst Du auch mit zuvielen Listen und Dictionaries und solltest besser mal über Klassen nachdenken, oder es liegt einfach an diesen nichtssagenden Namen. Die Frage liest sich nämlich ein bisschen wie "Ist es besser ein foo in ein frob zu kopieren und dann ans baz anzuhängen, oder sollte man das foo lieber in ein fargle schreiben, das als Wert in einem feeble steckt?". Mit diesen generischen Namen und ohne Ahnung *was* Du das semantisch eigentlich machen möchtest, kann man halt nicht viel sagen.

Re: Vergleich von Keys aus Dict mit Variablen + Bedingung

Verfasst: Dienstag 2. Juni 2009, 18:26
von Dill
zu langsam :?

Verfasst: Dienstag 2. Juni 2009, 18:36
von PhantomWorks
Hallo BlackJack!

Danke erstmal für Deine Antwort. Meine kleine Radtour gerade hat mich auf folgenden Gedanken gebracht, der Dir mein Problem hoffentlich etwas verdeutlicht:


Code: Alles auswählen

    for key in Dict1.keys():
        if TagAttribute == key:
            print "XXXXXXXXXXXXXXXXXXXXX" # nur zur Kontrolle
            XYZ = key.value()
Folgender Error erscheint:
XYZ = key.value()
AttributeError: 'str' object has no attribute 'value'
Diesen Error hier bekomme ich leider nicht weg. Ich will nun, nachdem ein Matching mit der Variablen TagAttribute gefunden wurde (in der Konsole werden mir viele Zeilen mit X'en ausgegeben, d.h. Treffer vorhanden), den Wert des betreffenden Schlüssels in XYZ schreiben.

Also, falls TagAttribute == Key2, dann schreibe den Wert von Key2 in XYZ.

Ich hoffe Du weißt jetzt was ich meine :wink:

Viele Grüße![/quote]

Verfasst: Dienstag 2. Juni 2009, 18:45
von Dill
der schlüssel ist hier ein string. der wert des schlüssels ist also dieser string.
mit diesem schlüssel kannst du aber auf das dict zugreifen.

dict[key]

Verfasst: Dienstag 2. Juni 2009, 18:48
von derdon
Schöner ist es, mit

Code: Alles auswählen

for key, value in my_dict.iteritems(): # bzw. my_dict.items() in Python 3
zu iterieren.

Verfasst: Dienstag 2. Juni 2009, 18:55
von BlackJack
Schöner wäre es wenn man die ``for``-Schleife sein lässt und sich mit `TagAttribute` als Schlüssel, den passenden Wert aus `Dict1` holt. Für den Zugriff über den Schlüssel sind Dictionaries doch da -- eine langsame lineare Suche könnte man auch mit Listen machen.

Verfasst: Dienstag 2. Juni 2009, 18:57
von derdon
Oh, stimmt. Hab mir den Code seeeeehr oberflächlich angeguckt :oops:

Verfasst: Dienstag 2. Juni 2009, 19:55
von cofi
Beim oberflächlichen drüberschaun des Codes ist mir aufgefallen, dass ein, zwei Links vielleicht angebracht wären:
[wiki]PEP 8 (Übersetzung)[/wiki] oder das Original

Verfasst: Mittwoch 3. Juni 2009, 15:07
von PhantomWorks
Danke für Eure Tipps!

Habe es jetzt so gemacht wie BlackJack es gesagt hat, ohne die for-Schleife.

Nun habe ich allerdings ein weitaus größeres Problem mit Eclipse:
Ich habe NICHTS verändert, doch nach einem Neustart von Eclipse erhalte ich beim Klicken auf den Run Button die Fehlermedlung
the selection did not contain any resources that can run on a server

Probiere schon hin und her, doch nichts half bis jetzt...

Bitte helft mir, nur noch dieses eine Mal! Danke Euch!! :roll:

Verfasst: Mittwoch 3. Juni 2009, 15:43
von cofi
Du solltest uns mal den Code zur Verfügung stellen, die Kristallkugeln vertragen das Wetter grad nicht. Wenn er länger ist unter http://paste.pocoo.org/

Auch solltest du mal probieren, ob das Skript bei einem Aufruf von der Konsole ausführbar ist.