Python Language
raggruppa per()
Ricerca…
introduzione
In Python, il metodo itertools.groupby()
consente agli sviluppatori di raggruppare i valori di una classe iterabile basata su una proprietà specificata in un altro insieme di valori iterabili.
Sintassi
- itertools.groupby (iterable, key = None o qualche funzione)
Parametri
Parametro | Dettagli |
---|---|
iterabile | Qualsiasi pitone iterabile |
chiave | Funzione (criteri) su cui raggruppare l'iterabile |
Osservazioni
groupby () è difficile ma una regola generale da tenere presente quando lo si usa è questa:
Ordinare sempre gli elementi che si desidera raggruppare con la stessa chiave che si desidera utilizzare per il raggruppamento
Si raccomanda al lettore di dare un'occhiata alla documentazione qui e vedere come viene spiegato usando una definizione di classe.
Esempio 1
Di 'che hai la corda
s = 'AAAABBBCCDAABBB'
e ti piacerebbe dividerlo in modo che tutte le 'A siano in una lista e quindi con tutte le' B 'e' C ', ecc. Potresti fare qualcosa di simile
s = 'AAAABBBCCDAABBB'
s_dict = {}
for i in s:
if i not in s_dict.keys():
s_dict[i] = [i]
else:
s_dict[i].append(i)
s_dict
Risultati in
{'A': ['A', 'A', 'A', 'A', 'A', 'A'],
'B': ['B', 'B', 'B', 'B', 'B', 'B'],
'C': ['C', 'C'],
'D': ['D']}
Ma per il set di dati di grandi dimensioni si potrebbero costruire questi elementi in memoria. È qui che entra in gioco groupby ()
Potremmo ottenere lo stesso risultato in modo più efficiente facendo quanto segue
# note that we get a {key : value} pair for iterating over the items just like in python dictionary
from itertools import groupby
s = 'AAAABBBCCDAABBB'
c = groupby(s)
dic = {}
for k, v in c:
dic[k] = list(v)
dic
Risultati in
{'A': ['A', 'A'], 'B': ['B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}
Si noti che il numero di "A" nel risultato quando abbiamo usato il gruppo per è inferiore al numero effettivo di "A" nella stringa originale. Possiamo evitare quella perdita di informazioni ordinando gli elementi in s prima di passarli a c come mostrato di seguito
c = groupby(sorted(s))
dic = {}
for k, v in c:
dic[k] = list(v)
dic
Risultati in
{'A': ['A', 'A', 'A', 'A', 'A', 'A'], 'B': ['B', 'B', 'B', 'B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}
Ora abbiamo tutte le nostre "A".
Esempio 2
Questo esempio illustra come viene scelta la chiave predefinita se non ne specificiamo alcuna
c = groupby(['goat', 'dog', 'cow', 1, 1, 2, 3, 11, 10, ('persons', 'man', 'woman')])
dic = {}
for k, v in c:
dic[k] = list(v)
dic
Risultati in
{1: [1, 1],
2: [2],
3: [3],
('persons', 'man', 'woman'): [('persons', 'man', 'woman')],
'cow': ['cow'],
'dog': ['dog'],
10: [10],
11: [11],
'goat': ['goat']}
Si noti qui che la tupla nel suo complesso conta come una chiave in questa lista
Esempio 3
Nota in questo esempio che mulato e cammello non appaiono nel nostro risultato. Viene mostrato solo l'ultimo elemento con la chiave specificata. L'ultimo risultato per c cancella in realtà due risultati precedenti. Ma guarda la nuova versione in cui ho i dati ordinati prima sulla stessa chiave.
list_things = ['goat', 'dog', 'donkey', 'mulato', 'cow', 'cat', ('persons', 'man', 'woman'), \
'wombat', 'mongoose', 'malloo', 'camel']
c = groupby(list_things, key=lambda x: x[0])
dic = {}
for k, v in c:
dic[k] = list(v)
dic
Risultati in
{'c': ['camel'],
'd': ['dog', 'donkey'],
'g': ['goat'],
'm': ['mongoose', 'malloo'],
'persons': [('persons', 'man', 'woman')],
'w': ['wombat']}
Versione ordinata
list_things = ['goat', 'dog', 'donkey', 'mulato', 'cow', 'cat', ('persons', 'man', 'woman'), \
'wombat', 'mongoose', 'malloo', 'camel']
sorted_list = sorted(list_things, key = lambda x: x[0])
print(sorted_list)
print()
c = groupby(sorted_list, key=lambda x: x[0])
dic = {}
for k, v in c:
dic[k] = list(v)
dic
Risultati in
['cow', 'cat', 'camel', 'dog', 'donkey', 'goat', 'mulato', 'mongoose', 'malloo', ('persons', 'man', 'woman'), 'wombat']
{'c': ['cow', 'cat', 'camel'],
'd': ['dog', 'donkey'],
'g': ['goat'],
'm': ['mulato', 'mongoose', 'malloo'],
'persons': [('persons', 'man', 'woman')],
'w': ['wombat']}
Esempio 4
In questo esempio vediamo cosa succede quando usiamo diversi tipi di iterabili.
things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "harley"), \
("vehicle", "speed boat"), ("vehicle", "school bus")]
dic = {}
f = lambda x: x[0]
for key, group in groupby(sorted(things, key=f), f):
dic[key] = list(group)
dic
Risultati in
{'animal': [('animal', 'bear'), ('animal', 'duck')],
'plant': [('plant', 'cactus')],
'vehicle': [('vehicle', 'harley'),
('vehicle', 'speed boat'),
('vehicle', 'school bus')]}
Questo esempio qui sotto è essenzialmente uguale a quello sopra. L'unica differenza è che ho modificato tutte le tuple alle liste.
things = [["animal", "bear"], ["animal", "duck"], ["vehicle", "harley"], ["plant", "cactus"], \
["vehicle", "speed boat"], ["vehicle", "school bus"]]
dic = {}
f = lambda x: x[0]
for key, group in groupby(sorted(things, key=f), f):
dic[key] = list(group)
dic
risultati
{'animal': [['animal', 'bear'], ['animal', 'duck']],
'plant': [['plant', 'cactus']],
'vehicle': [['vehicle', 'harley'],
['vehicle', 'speed boat'],
['vehicle', 'school bus']]}