Seite 1 von 1

Dict mit Listen

Verfasst: Samstag 15. Januar 2011, 20:06
von burli
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

Re: Dict mit Listen

Verfasst: Samstag 15. Januar 2011, 20:16
von DasIch
Nutz defaultdict(list) oder ein MultiDict.

Re: Dict mit Listen

Verfasst: Samstag 15. Januar 2011, 20:30
von burli
Danke, ich denke, ich verwende Defaultdict

Re: Dict mit Listen

Verfasst: Samstag 15. Januar 2011, 20:48
von str1442
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]}

Re: Dict mit Listen

Verfasst: Samstag 15. Januar 2011, 21:26
von burli
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

Re: Dict mit Listen

Verfasst: Sonntag 16. Januar 2011, 10:12
von .robert

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

Re: Dict mit Listen

Verfasst: Sonntag 16. Januar 2011, 10:18
von burli
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

Re: Dict mit Listen

Verfasst: Sonntag 16. Januar 2011, 10:21
von .robert
Das `append`geht ja auch an die Liste und nicht das Dict...

Aber stimmt schon, mit defaultdict geht es mit weniger Zeilen...

Re: Dict mit Listen

Verfasst: Sonntag 16. Januar 2011, 10:24
von cofi
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)

Re: Dict mit Listen

Verfasst: Sonntag 16. Januar 2011, 10:36
von burli
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.