Seite 1 von 1
Liste zur Dictionary konvertieren
Verfasst: Sonntag 21. Juni 2015, 19:07
von BjoernLaemmerzahl
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.
Re: Liste zur Dictionary konvertieren
Verfasst: Sonntag 21. Juni 2015, 19:14
von Sirius3
@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?
Re: Liste zur Dictionary konvertieren
Verfasst: Sonntag 21. Juni 2015, 19:29
von BjoernLaemmerzahl
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.
Re: Liste zur Dictionary konvertieren
Verfasst: Sonntag 21. Juni 2015, 19:37
von Sirius3
XML und keine Struktur, das ist ja ein Widerspruch in sich
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.
Re: Liste zur Dictionary konvertieren
Verfasst: Montag 22. Juni 2015, 18:14
von Kebap
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?
Re: Liste zur Dictionary konvertieren
Verfasst: Samstag 11. Juli 2015, 21:33
von BjoernLaemmerzahl
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.
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.
Re: Liste zur Dictionary konvertieren
Verfasst: Samstag 11. Juli 2015, 21:49
von 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()`.
Re: Liste zur Dictionary konvertieren
Verfasst: Samstag 11. Juli 2015, 22:02
von Sirius3
@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))