Python Language
gruppiere nach()
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']]}