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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow