Dict mit Listen

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
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich knabbere gerade wieder an einem Problem, für das ich bisher keine Lösung gefunden habe. Diesmal ist es ein Dict mit Listen. Folgendes Szenario. Ich habe eine Tabelle mit Namen und Werten. Die Namen können dabei mehrfach vorkommen. Ein Beispiel

Code: Alles auswählen

foo - 5
foo - 7
bar - 3
foo - 2
bar - 9
Ich möchte daraus jetzt ein Dictionary machen mit den Namen als Key und den Werten als Liste hinter dem jeweiligen Key

Code: Alles auswählen

{ 'foo' : [5,7,2]}
{ 'bar' : [3,9]}
Ich hoffe, ich hab das richtig geschrieben. Ich habe das irgendwie so versucht:

Code: Alles auswählen

mydict = {}
for item in tabelle:
  mydict[item.name]= Wert an die Liste anhängen
Ich hab nur gerade keinen Plan, wie man das Dict definiert und wie man die Liste erstellt und erweitert. Ich hoffe, dass war verständlich genug erklärt
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Nutz defaultdict(list) oder ein MultiDict.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Danke, ich denke, ich verwende Defaultdict
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Für das eigentliche Problem gibt es itertools.groupby():

Code: Alles auswählen

>>> a = [("foo", 1), ("bar", 2), ("foo", 3)]
>>> from itertools import groupby
>>> from operator import itemgetter
>>> print dict((k, [x[1] for x in v]) for k, v in groupby(sorted(a, key=itemgetter(0)), key=itemgetter(0)))
{'foo': [1, 3], 'bar': [2]}
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

str1442 hat geschrieben:Für das eigentliche Problem gibt es itertools.groupby():

Code: Alles auswählen

>>> a = [("foo", 1), ("bar", 2), ("foo", 3)]
>>> from itertools import groupby
>>> from operator import itemgetter
>>> print dict((k, [x[1] for x in v]) for k, v in groupby(sorted(a, key=itemgetter(0)), key=itemgetter(0)))
{'foo': [1, 3], 'bar': [2]}
Cool, auch nicht schlecht. Allerdings liegen meine Daten nicht als Dict vor. Die müsste ich erst umstricken
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Code: Alles auswählen

mydict = {}
for item in tabelle:
    key, value = item.split(' - ')
    if mydict.has_key(key):
        mydict[key].append(value)
    else:
        mydict[key] = [value]
kann man bestimmt "magischer" machen, aber ich finde so ist es gut zu lesen und zu verstehen...
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Mit einem normalen Dict funktioniert .append() ja nicht. Zumindest hab ich es hier so nicht hinbekommen. Deshalb ja überhaupt die Frage. Mit Defaultdict geht es
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Das `append`geht ja auch an die Liste und nicht das Dict...

Aber stimmt schon, mit defaultdict geht es mit weniger Zeilen...
Zuletzt geändert von .robert am Sonntag 16. Januar 2011, 10:24, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Natuerlich geht das. Das Problem das dabei besteht - noch nicht bestehende listen - loest .robert ja.
Was man aber auch per `setdefault` oder `get` loesen kann.

Code: Alles auswählen

d = dict()
for item in table:
    key, value = item.split(' - ')
    d.setdefault(key, list()).append(value)
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Stimmt, jetzt seh ich's auch. Mein Problem war halt, überhaupt erstmal die Liste in das Dict zu bekommen. Jetzt wo ich es sehe ist es natürlich logisch.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Antworten