Suche…


Einführung

Mit der Methode itertools.groupby() können Entwickler in Python Werte einer iterierbaren Klasse basierend auf einer angegebenen Eigenschaft in eine andere iterierbare Menge von Werten gruppieren.

Syntax

  • itertools.groupby (iterable, key = None oder eine Funktion)

Parameter

Parameter Einzelheiten
iterable Jeder Python iterierbar
Schlüssel Funktion (Kriterien), nach der das Iterierbare gruppiert werden soll

Bemerkungen

groupby () ist knifflig, aber eine allgemeine Regel, die bei der Verwendung zu beachten ist:

Sortieren Sie die Elemente, die Sie gruppieren möchten, immer mit demselben Schlüssel, den Sie für die Gruppierung verwenden möchten

Es wird empfohlen, dass sich der Leser die Dokumentation hier ansieht und anhand einer Klassendefinition erläutert, wie diese erklärt wird.

Beispiel 1

Sagen Sie, Sie haben die Schnur

s = 'AAAABBBCCDAABBB'

und Sie möchten es teilen, so dass alle 'A' in einer Liste stehen und so mit 'B' und 'C' usw. Sie könnten so etwas tun

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

Ergebnisse in

{'A': ['A', 'A', 'A', 'A', 'A', 'A'],
 'B': ['B', 'B', 'B', 'B', 'B', 'B'],
 'C': ['C', 'C'],
 'D': ['D']}

Bei großen Datenmengen würden Sie diese Elemente jedoch im Speicher aufbauen. Hier kommt groupby () ins Spiel

Wir könnten das gleiche Ergebnis auf eine effizientere Weise erzielen, indem Sie Folgendes tun

# 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

Ergebnisse in

{'A': ['A', 'A'], 'B': ['B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}

Beachten Sie, dass die Anzahl von 'A' im Ergebnis, wenn Sie group by verwendet haben, geringer ist als die tatsächliche Anzahl von 'A' in der ursprünglichen Zeichenfolge. Wir können diesen Informationsverlust vermeiden, indem wir die Elemente in s sortieren, bevor Sie sie an c übergeben (siehe unten)

c = groupby(sorted(s))

dic = {} 
for k, v in c:
    dic[k] = list(v)
dic

Ergebnisse in

{'A': ['A', 'A', 'A', 'A', 'A', 'A'], 'B': ['B', 'B', 'B', 'B', 'B', 'B'], 'C': ['C', 'C'], 'D': ['D']}

Jetzt haben wir alle unsere 'A'.

Beispiel 2

Dieses Beispiel zeigt, wie der Standardschlüssel ausgewählt wird, wenn wir keinen angeben

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

Ergebnisse in

{1: [1, 1],
 2: [2],
 3: [3],
 ('persons', 'man', 'woman'): [('persons', 'man', 'woman')],
 'cow': ['cow'],
 'dog': ['dog'],
 10: [10],
 11: [11],
 'goat': ['goat']}

Beachten Sie hierbei, dass das Tupel als Ganzes in dieser Liste als eine Taste zählt

Beispiel 3

Beachten Sie in diesem Beispiel, dass Mulato und Kamel in unserem Ergebnis nicht angezeigt werden. Nur das letzte Element mit dem angegebenen Schlüssel wird angezeigt. Das letzte Ergebnis für c löscht tatsächlich zwei vorherige Ergebnisse. Aber schau dir die neue Version an, bei der ich die Daten zuerst auf demselben Schlüssel sortiert habe.

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

Ergebnisse in

{'c': ['camel'],
 'd': ['dog', 'donkey'],
 'g': ['goat'],
 'm': ['mongoose', 'malloo'],
 'persons': [('persons', 'man', 'woman')],
 'w': ['wombat']}

Sortierte 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

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

Beispiel 4

In diesem Beispiel sehen wir, was passiert, wenn wir verschiedene Arten von Iterationen verwenden.

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

Ergebnisse in

{'animal': [('animal', 'bear'), ('animal', 'duck')],
 'plant': [('plant', 'cactus')],
 'vehicle': [('vehicle', 'harley'),
  ('vehicle', 'speed boat'),
  ('vehicle', 'school bus')]}

Dieses Beispiel ist im Wesentlichen dasselbe wie das darüber. Der einzige Unterschied ist, dass ich alle Tupel in Listen geändert habe.

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

Ergebnisse

{'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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow