Seite 1 von 1

Menge nach Attributen gruppieren

Verfasst: Sonntag 6. März 2011, 20:02
von sprudel
Hallo,
mal angenommen ich habe folgende Menge:

m[0].hash = "abc"
m[1].hash = "def"
m[2].hash = "abc"
m[3].hash = "abc"
m[4].hash = "def"
m[5].hash = "xyz"

Ich möchte diese nun gruppieren, so dass die jeweiligen Objekte (!) in getrennte Listen kommen. Es geht allein um den Wert im Attribut .hash . Der Rest ist unentscheidend.

Hat da jemand ne Idee, wie man das am cleversten löst?

Liebe Grüße
Chris

Re: Menge nach Attributen gruppieren

Verfasst: Sonntag 6. März 2011, 20:17
von anogayales
Pack sie doch einfach ein ein Dictionary, das Listen enthält.

Code: Alles auswählen

grp = {}
for element in m:
	try:
		grp[element.hash].append(element)
	except KeyError:
		grp[element.hash] = []
		grp[element.hash].append(element)
Grüße,
anogayales

Re: Menge nach Attributen gruppieren

Verfasst: Sonntag 6. März 2011, 20:31
von cofi
Das geht noch kuerzer:

Code: Alles auswählen

grp = {}
for element in m:
    grp.setdefault(element.hash, []).append(element)

Re: Menge nach Attributen gruppieren

Verfasst: Sonntag 6. März 2011, 21:09
von lunar
Und es geht auch schöner, entweder mit "defaultdict" ...

Code: Alles auswählen

from collections import defaultdict
grp = defaultdict(list)
for element in m:
    grp[element.hash].append(element)
... oder mit "itertools.groupby":

Code: Alles auswählen

from itertools import groupby
from operator import attrgetter
grp = {}
for key, items in itertools.groupby(m, attrgetter('hash')):
    grp[key] = list(items)

Re: Menge nach Attributen gruppieren

Verfasst: Sonntag 6. März 2011, 22:33
von BlackJack
@lunar: Für `groupby()` müsstest Du noch sortieren.

Re: Menge nach Attributen gruppieren

Verfasst: Montag 7. März 2011, 07:30
von snafu
`defaultdict` dürfte sich hier wohl am noch am besten für die Aufgabe eignen.

Re: Menge nach Attributen gruppieren

Verfasst: Montag 7. März 2011, 08:52
von lunar
@BlackJack: Stimmt, daran hatte ich nicht gedacht. Mein Fehler, Verzeihung.