Konvertieren dict-Werte in eine Reihe, während die Erhaltung der dict
Habe ich ein dict wie diese:
(100002: 'APPLE', 100004: 'BANANE', 100005: 'KAROTTE')
Ich versuche, meine dict-haben int-Werte für den Schlüssel (wie Sie es jetzt tut), sondern setzt für die Werte (anstelle von Zeichenfolgen, wie es jetzt ist.) Mein Ziel ist es, in der Lage zu Lesen .csv Datei mit einer Spalte für den Schlüssel (int, nämlich das Element-id-Nummer) und dann Spalten für Dinge wie Größe, Form und Farbe. Ich möchte hinzufügen, diese Informationen in meinem dict, so dass nur die Informationen für die keys bereits in dict Hinzugefügt werden.
Mein Ziel dict könnte wie folgt Aussehen:
(100002: set(['APPLE','MEDIUM','ROUND','RED']), 100004: set(['Banana','MEDIUM','LONG','YELLOW']), 100005: set(['CARROT','MEDIUM','LONG','ORANGE'])
Angefangen mit meiner dict-nur key + string Element name -, ich habe versucht einen code wie diesen zu Lesen, der zusätzliche Informationen aus .csv-Datei:
infile = open('FileWithTheData.csv', 'r')
for line in infile.readlines():
spl_line = line.split(',')
if int(spl_line[0]) in MyDict.keys():
MyDict[int(spl_line[0])].update(spl_line[1:])
Leider ist dieser Fehler heraus sagen AttributeError: 'str' object has no attribute 'update'
. Meine versuche zu ändern meine Wörterbuch-Werte in sets, so dass ich dann .update Sie haben dabei Dinge wie diese: (100002: set(['A','P','L','E']), 100004: set(['B','A','N']), 100005: set(['C','A','R','O','T']))
Ich möchte konvertieren Sie die Werte zu einer Reihe, so dass die Zeichenfolge, die aktuell als Wert wird die erste Zeichenfolge in dem Satz eher als Aufbrechen der string in Buchstaben und damit in diesen Briefen.
Ich auch versucht, die Werte einstellen, wenn ich die dict-zippen und zwei Listen zusammen, aber es scheint nicht zu keinen Unterschied machen. So etwas wie dieses
MyDict = dict(zip(listofkeys, set(listofnames)))
noch macht die ganze listofnames Liste in ein set, aber es erreicht nicht mein Ziel, dass jeder Wert in MyDict in eine Reihe mit den entsprechenden string aus listofnames als der erste string im set.
Wie kann ich die Werte in MyDict in eine Reihe, so dass ich hinzufügen kann, zusätzliche Saiten, die eingestellt werden, ohne daß der string, der aktuell Wert in der dict-in eine Reihe von einzelnen Buchstaben?
BEARBEITEN:
Ich machen derzeit MyDict, indem eine Funktion zum generieren einer Liste von Element-ids (auch die keys) und eine weitere Funktion, die sieht die item-ids zu generieren, die eine Liste der entsprechenden item-Namen (verwenden Sie einen zwei-Spalte .csv-Datei als Datenquelle) und dann habe ich zip
Sie zusammen.
ANTWORT:
Verwenden Sie die Vorschläge hier, ich kam mit dieser Lösung. Ich fand, dass der Abschnitt, der set()).update kann einfach geändert werden, um list()).anfügen", um die Ausbeute einer Liste anstatt einer Reihe (so dass die Reihenfolge beibehalten wird.) Ich fand es auch einfacher zu aktualisieren .csv-Daten-input-Dateien durch hinzufügen der Spalte mit Namen der FileWithTheData.csv so, dass ich nicht zu Durcheinander mit der dict, konvertieren der Werte setzt, und dann das hinzufügen von mehr Daten. Mein code für diesen Abschnitt sieht nun wie folgt aus:
MyDict = {}
infile = open('FileWithTheData.csv', 'r')
for line in infile.readlines():
spl_line = line.split(',')
if int(spl_line[0]) in itemidlist: #note that this is the list I was formerly zipping together with a corresponding list of names to make my dict
MyDict.setdefault(int(spl_line[0]), list()).append(spl_line[1:])
print MyDict
- Bitte zeigen Sie, wie Sie erstellen die
MyDict
variable.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Fehler ist, weil ursprünglich Ihre
MyDict
variable ordnet einen integer in einen string. Wenn Sie versuchen, Sie zu aktualisieren, Sie behandeln den Wert wie einset,
wenn es ein string ist.Können Sie eine defaultdict für diese:
in MyDict.items()
oderin MyDict.iteritems()
.setdefault
geholfen ein gutes Stück, wie gut.Ihr Problem mit, wie Sie zu initialisieren
MyDict
haben, versuchen Sie es auf die folgenden:Hier ist ein kurzes Beispiel für den Unterschied:
set(listofnames)
wird nur gehen, drehen Sie Ihre Liste in eine Reihe, und die einzige Auswirkung, die das haben könnten, ist so Sortieren Sie die Werte wie oben gesehen. Sie wirklich wollen, zu nehmen, jeder string-Wert in der Liste und konvertieren Sie es zu einer ein-element-set, das ist das, was die list comprehension hat.Nachdem Sie diese änderung vorgenommen haben, Ihren aktuellen code sollte funktionieren, aber Sie können nur tun, die enthält, schauen Sie direkt auf das Wörterbuch, anstatt explizit die Prüfung der Schlüssel (
key in MyDict
ist das gleiche wiekey in MyDict.keys()
).