Python Language
GroupBy ()
Zoeken…
Invoering
In Python kunnen ontwikkelaars met de methode itertools.groupby()
waarden van een iterabele klasse op basis van een opgegeven eigenschap groeperen in een andere iterabele set waarden.
Syntaxis
- itertools.groupby (iterable, key = None or some function)
parameters
Parameter | Details |
---|---|
iterable | Elke python iterabel |
sleutel | Functie (criteria) waarop de iterabele moet worden gegroepeerd |
Opmerkingen
groupby () is lastig, maar een algemene regel om in gedachten te houden bij het gebruik is als volgt:
Sorteer de items die u wilt groeperen altijd met dezelfde sleutel die u wilt gebruiken voor groeperen
Het wordt aanbevolen dat de lezer een kijkje nemen op de documentatie hier en zie hoe het wordt uitgelegd aan de hand van een klasse definitie.
voorbeeld 1
Stel dat je het touw hebt
s = 'AAAABBBCCDAABBB'
en je wilt het splitsen zodat alle 'A's in één lijst staan en dus met alle' B's en 'C', enz. Je zou zoiets kunnen doen
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
Resulteert in
{'A': ['A', 'A', 'A', 'A', 'A', 'A'],
'B': ['B', 'B', 'B', 'B', 'B', 'B'],
'C': ['C', 'C'],
'D': ['D']}
Maar voor grote gegevensverzamelingen zou u deze items in het geheugen opbouwen. Dit is waar groupby () binnenkomt
We kunnen hetzelfde resultaat op een efficiëntere manier krijgen door het volgende te doen
# 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
Resulteert in
{'A': ['A', 'A'], 'B': ['B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}
Merk op dat het aantal 'A's in het resultaat wanneer we groep door gebruikten kleiner is dan het werkelijke aantal' A's in de oorspronkelijke string. We kunnen dat verlies van informatie voorkomen door de items in s te sorteren voordat we deze naar c doorgeven, zoals hieronder wordt weergegeven
c = groupby(sorted(s))
dic = {}
for k, v in c:
dic[k] = list(v)
dic
Resulteert in
{'A': ['A', 'A', 'A', 'A', 'A', 'A'], 'B': ['B', 'B', 'B', 'B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}
Nu hebben we al onze 'A's.
Voorbeeld 2
Dit voorbeeld illustreert hoe de standaardsleutel wordt gekozen als we deze niet opgeven
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
Resulteert in
{1: [1, 1],
2: [2],
3: [3],
('persons', 'man', 'woman'): [('persons', 'man', 'woman')],
'cow': ['cow'],
'dog': ['dog'],
10: [10],
11: [11],
'goat': ['goat']}
Merk hier op dat de tuple als geheel als één sleutel in deze lijst telt
Voorbeeld 3
Merk in dit voorbeeld op dat mulato en kameel niet in ons resultaat verschijnen. Alleen het laatste element met de opgegeven sleutel wordt weergegeven. Het laatste resultaat voor c vernietigt eigenlijk twee eerdere resultaten. Maar let op de nieuwe versie waarbij ik de gegevens eerst op dezelfde sleutel sorteer.
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
Resulteert in
{'c': ['camel'],
'd': ['dog', 'donkey'],
'g': ['goat'],
'm': ['mongoose', 'malloo'],
'persons': [('persons', 'man', 'woman')],
'w': ['wombat']}
Gesorteerde versie
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
Resulteert 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']}
Voorbeeld 4
In dit voorbeeld zien we wat er gebeurt als we verschillende soorten iterabele gebruiken.
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
Resulteert in
{'animal': [('animal', 'bear'), ('animal', 'duck')],
'plant': [('plant', 'cactus')],
'vehicle': [('vehicle', 'harley'),
('vehicle', 'speed boat'),
('vehicle', 'school bus')]}
Dit onderstaande voorbeeld is in wezen hetzelfde als dat erboven. Het enige verschil is dat ik alle tupels in lijsten heb veranderd.
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
resultaten
{'animal': [['animal', 'bear'], ['animal', 'duck']],
'plant': [['plant', 'cactus']],
'vehicle': [['vehicle', 'harley'],
['vehicle', 'speed boat'],
['vehicle', 'school bus']]}