Python Language
Grupp av()
Sök…
Introduktion
I Python itertools.groupby()
metoden itertools.groupby()
utvecklare att gruppera värden i en iterbar klass baserad på en specificerad egenskap i en annan iterbar uppsättning värden.
Syntax
- itertools.groupby (iterable, key = Ingen eller någon funktion)
parametrar
Parameter | detaljer |
---|---|
iterable | Varje python-iterbar |
nyckel | Funktion (kriterier) för att gruppera iterable |
Anmärkningar
groupby () är knepigt men en allmän regel att tänka på när du använder den är följande:
Sortera alltid objekten du vill gruppera med samma nyckel som du vill använda för gruppering
Det rekommenderas att läsaren tittar på dokumentationen här och ser hur den förklaras med en klassdefinition.
Exempel 1
Säg att du har strängen
s = 'AAAABBBCCDAABBB'
och du vill dela upp det så att alla "A: er finns i en lista och så med alla" B och "C", etc. Du kan göra något liknande
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
Resulterar i
{'A': ['A', 'A', 'A', 'A', 'A', 'A'],
'B': ['B', 'B', 'B', 'B', 'B', 'B'],
'C': ['C', 'C'],
'D': ['D']}
Men för stora datamängder skulle du bygga upp dessa objekt i minnet. Det är här gruppby () kommer in
Vi kan få samma resultat på ett mer effektivt sätt genom att göra följande
# 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
Resulterar i
{'A': ['A', 'A'], 'B': ['B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}
Lägg märke till att antalet A i resultatet när vi använde grupp med är mindre än det faktiska antalet A i originalsträngen. Vi kan undvika att förlust av information genom att sortera objekten i s innan vi skickar den till c som visas nedan
c = groupby(sorted(s))
dic = {}
for k, v in c:
dic[k] = list(v)
dic
Resulterar i
{'A': ['A', 'A', 'A', 'A', 'A', 'A'], 'B': ['B', 'B', 'B', 'B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}
Nu har vi alla våra A-er.
Exempel 2
Detta exempel illustrerar hur standardnyckeln väljs om vi inte anger någon
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
Resulterar i
{1: [1, 1],
2: [2],
3: [3],
('persons', 'man', 'woman'): [('persons', 'man', 'woman')],
'cow': ['cow'],
'dog': ['dog'],
10: [10],
11: [11],
'goat': ['goat']}
Lägg märke till att tupeln som helhet räknas som en nyckel i listan
Exempel 3
Lägg märke till i detta exempel att mulato och kamel inte dyker upp i vårt resultat. Endast det sista elementet med den angivna tangenten dyker upp. Det sista resultatet för c utplånar faktiskt två tidigare resultat. Men titta på den nya versionen där jag har sorterat data först på samma nyckel.
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
Resulterar i
{'c': ['camel'],
'd': ['dog', 'donkey'],
'g': ['goat'],
'm': ['mongoose', 'malloo'],
'persons': [('persons', 'man', 'woman')],
'w': ['wombat']}
Sorterad version
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
Resulterar i
['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']}
Exempel 4
I det här exemplet ser vi vad som händer när vi använder olika typer av iterable.
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
Resulterar i
{'animal': [('animal', 'bear'), ('animal', 'duck')],
'plant': [('plant', 'cactus')],
'vehicle': [('vehicle', 'harley'),
('vehicle', 'speed boat'),
('vehicle', 'school bus')]}
Exemplet nedan är väsentligen detsamma som det ovan. Den enda skillnaden är att jag har ändrat alla tupplar till listor.
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
Resultat
{'animal': [['animal', 'bear'], ['animal', 'duck']],
'plant': [['plant', 'cactus']],
'vehicle': [['vehicle', 'harley'],
['vehicle', 'speed boat'],
['vehicle', 'school bus']]}