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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow