Menge nach Attributen gruppieren

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
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

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
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das geht noch kuerzer:

Code: Alles auswählen

grp = {}
for element in m:
    grp.setdefault(element.hash, []).append(element)
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)
BlackJack

@lunar: Für `groupby()` müsstest Du noch sortieren.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

`defaultdict` dürfte sich hier wohl am noch am besten für die Aufgabe eignen.
lunar

@BlackJack: Stimmt, daran hatte ich nicht gedacht. Mein Fehler, Verzeihung.
Antworten