Vergleich von Keys aus Dict mit Variablen + Bedingung

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
PhantomWorks
User
Beiträge: 18
Registriert: Samstag 25. April 2009, 11:11

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!!
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.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

zu langsam :?
Zuletzt geändert von Dill am Dienstag 2. Juni 2009, 18:43, insgesamt 1-mal geändert.
http://www.kinderpornos.info
PhantomWorks
User
Beiträge: 18
Registriert: Samstag 25. April 2009, 11:11

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]
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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]
http://www.kinderpornos.info
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
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.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Oh, stimmt. Hab mir den Code seeeeehr oberflächlich angeguckt :oops:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Zuletzt geändert von cofi am Mittwoch 3. Juni 2009, 15:44, insgesamt 1-mal geändert.
PhantomWorks
User
Beiträge: 18
Registriert: Samstag 25. April 2009, 11:11

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:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Antworten