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']]}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow