Liste zur Dictionary konvertieren

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
BjoernLaemmerzahl
User
Beiträge: 22
Registriert: Sonntag 17. Mai 2015, 12:22

Hallo,

zu beginn,wie sich sicherlich an der Frage erkennen lässt; Ich bin absolut neu beim Thema Python, bzw. Programmierung im Allgemeinem.

Ich habe folgendes Problem-
Ich habe eine Liste welche wie folgt strukturiert ist:
["Name1", "Telefonnummer1", "Adresse1", "Auto1", "Haus1", "Name2", "Telefonnummer2", "Adresse2", "Auto2", "Haus2",] ... usw.
Die Liste beginnt aller 5 Einträge mit einem neuen Namen.

Daraus möchte ich ein Dictionary mit folgender Struktur machen.

eintrag1["name"] = "Name1"
eintrag1["adresse"] = "Adresse1"
....
eintrag2["name"] = "Name2"
eintrag2["adresse"] = "Adresse2"

usw.

Ich habe schon einige Einträge bei StackOverflow gesehen, welcher mit "itertools" das Problem lösen, konnte diese allerdings nicht nachvollziehen.

Meine Lösung sieht so aus, funktionert aber leider nicht.

for i in range(len(meineliste)):
eintrag = {}
eintrag["Name"] = meineliste[0::5]

Dabei bekomme ich aber den Fehler "NameError: global name 'eintrag' is not defined"

Habt ihr eine Idee?

Vielen Dank und einen schönen Sonntagabend euch noch.
Zuletzt geändert von BjoernLaemmerzahl am Sonntag 21. Juni 2015, 19:24, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@BjoernLaemmerzahl: und wo definierst Du 'eintrag'? Was ist 'meineliste', 'plant' oder 'mylist'?
Bei Deinem Beispiel sind es nur drei statt fünf Elemente: Name, Telefonnummer und Addresse. Woher kommt diese Liste? Warum ist alles in einer Liste, was nicht in einer Liste hintereinander stehen sollte?
BjoernLaemmerzahl
User
Beiträge: 22
Registriert: Sonntag 17. Mai 2015, 12:22

Hallo Sirius3,

Danke für deine superschnelle Antwort.

Ich habe den Fehler berichtigt. Die Aufzählung sollte nur als Beispiel dienen. Die Liste beginnt nach 5 Einträgen neu. Die Liste kommt aus eine XML Datei welche leider keine Struktur enthält.

"meineliste" is die Liste wie oben beschrieben...
Ich dachte, das ich "eintrag" damit definiere:
eintrag = {}


"mylist" und "plant" habe ich übersehen. In meinem Quellcode benutze ich andere Variablennamen. Habe es korrigiert.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

XML und keine Struktur, das ist ja ein Widerspruch in sich :P

Mit Deiner Zeile weist Du einem Index i der Variable eintrag einen Wert zu, aber da eintrag nicht definiert ist, kann Python auch auf keinen Index zugreifen.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Kannst du mal ein Teil als Beispiel aus der XML Datei zeigen? Können ja Phantasiewerte sein, nur wegen der seltsamen Struktur.

Warum möchtest du ein Dictionary mit gerade dieser Struktur erstellen? Mir scheint das auch seltsam. Man will eigentlich nie Variablennamen durchnummerieren. Mir scheint, du willst eine Mischung aus Liste und Dictionary, oder sogar eine Klasse, falls du das schon kannst. Aber nochmal die Frage: Warum gerade diese Struktur? Was ist das eigentliche Endziel?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
BjoernLaemmerzahl
User
Beiträge: 22
Registriert: Sonntag 17. Mai 2015, 12:22

Hallo,

danke für eure Antworten.

Die Struktur der XML sieht so aus:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE pdf2xml SYSTEM "pdf2xml.dtd">

<pdf2xml>
<text top="230" left="105" width="91" height="11" font="4">ALDEADAVILA-I G-1</text>
<text top="230" left="297" width="76" height="11" font="4">22/06/2015 08:30</text>
<text top="230" left="420" width="76" height="11" font="4">10/07/2015 15:00</text>
<text top="230" left="560" width="14" height="11" font="4">0.0</text>
<text top="230" left="634" width="120" height="11" font="4">PROGRAMADO-PLANNED</text>
<text top="252" left="105" width="91" height="11" font="4">ALDEADAVILA-I G-2</text>
<text top="252" left="297" width="76" height="11" font="4">01/06/2015 08:30</text>
<text top="252" left="420" width="76" height="11" font="4">19/06/2015 15:00</text>
<text top="252" left="560" width="14" height="11" font="4">0.0</text>
<text top="252" left="634" width="120" height="11" font="4">PROGRAMADO-PLANNED</text>
Wie ihr seht, existieren keine wirklichen Ebenen. Das liegt daran, dass es der Output einer Konvertierung aus einer PDF ist und PDF eben keine inhaltliche Struktur hat welche in der XML übernommen werden kann.

Ich möchte die obige XML in ein dictionary laden, damit ich nacher das dictionary vergleichen kann. Sollte sich die XML Datei ändern, dann möchte ich sehen, wo der Unterschied ist.

Meine Lösung sieht bis jetzt so aus:

Code: Alles auswählen

plants = {"Name" : "Value", "Date Start" : "Value","Date End" : "Value", "Affected" : "Value", "Type" : "Value"}

for i in xrange(0,len(mylist)-5,5):
    #plants["Name"].append(mylist[i])
    plants.update({'Name': mylist[i]})
    plants["Date Start"] = mylist[i+1]
    plants["Date End"] = mylist[i+2]
    plants["Affected"] = mylist[i+3]
    plants["Type"] = mylist[i+4]
Die Schleifer soll jeweils den ersten (zweiten, usw.) Wert der List in das dictionary schreiben, dann den iterator (i) um 5 erhöhen und die nächsten 5 Werte hinzufügen.

Mein Problem ist leider noch, dass die Werte ersetzt werden und nicht, wie ich es möchte als Werte dem Key angefügt werden.

Code: Alles auswählen

#plants["Name"].append(mylist[i])
bekomme ich gleich gar nicht zum laufen, sondern nur die Fehlermeldung
plants['Name'].append(mylist)
AttributeError: 'str' object has no attribute 'append'



Vielen Dank für eure tolle Hilfe.
BlackJack

@BjoernLaemmerzahl: Ich würde früher ansetzen und gar nicht erst die flache Liste erstellen. Man kann die Elemente im XML ja offenbar ganz gut am `top`-Attribut gruppieren. Da hilft `itertools.groupby()`.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@BjoernLaemmerzahl: statt ein Dictionary zu ändern ist es besser, jeweils ein neues zu erzeugen.

Code: Alles auswählen

KEYS = ["Name", "Date Start", "Date End", "Affected", "Type"]

def generate_plants(keys, values):
    values = iter(values)
    while True:
        result = dict(zip(keys, values))
        if not result:
            break
        yield result

plants = list(generate_plants(KEYS, mylist))
Antworten