Mi sento come se Python avesse un built-in per farlo. Prendi un elenco di elementi e trasformali in un dizionario che mappa le chiavi in un elenco di elementi con quella chiave in comune.Raggruppamento di elementi con una chiave?
E 'abbastanza facile da fare:
# using defaultdict
lookup = collections.defaultdict(list)
for item in items:
lookup[key(item)].append(item)
# or, using plain dict
lookup = {}
for item in items:
lookup.setdefault(key(item), []).append(item)
Ma questo è abbastanza frequente di un caso d'uso che una funzione built-in sarebbe bello. Ho potuto implementare io stesso, come ad esempio:
def grouped(iterable, key):
result = {}
for item in iterable:
result.setdefault(key(item), []).append(item)
return result
lookup = grouped(items, key)
Questo è diverso itertools.groupby
in alcuni modi importanti. Per ottenere lo stesso risultato da groupby
, dovreste fare questo, che è un po 'brutto:
lookup = dict((k, list(v)) for k, v in groupby(sorted(items, key=key), key))
Alcuni esempi:
>>> items = range(10)
>>> grouped(items, lambda x: x % 2)
{0: [0, 2, 4, 6, 8], 1: [1, 3, 5, 7, 9]}
>>> items = 'hello stack overflow how are you'.split()
>>> grouped(items, len)
{8: ['overflow'], 3: ['how', 'are', 'you'], 5: ['hello', 'stack']}
C'è un modo migliore?
Non vedo come si tratti di un "caso abbastanza frequente di utilizzo". Lo uso raramente e, quando devo, usare un 'defaultdict' è semplicemente perfetto. AFAIK non c'è alcun built-in che faccia ciò che vuoi da solo. – Bakuriu
Probabilmente hai ragione, ma una parte di me pensa che sia altrettanto valido di un built-in come groupby. – FogleBird