Frage 18 zum Python-Datenstrukturalgorithmus: Datensätze nach einem bestimmten Feld gruppieren

Frage:

Sie verfügen über ein Wörterbuch oder eine Folge von Instanzen und möchten diese nach einem bestimmten Feld wie Datum gruppiert durchlaufen.

Lösung:

Die Funktion itertools.groupby() ist für solche Datengruppierungsoperationen sehr nützlich. Nehmen Sie zu Demonstrationszwecken an, dass Sie bereits über die folgende Liste von Wörterbüchern verfügen.

rows = [
    {
    
    'address': '5412 N CLARK', 'date': '07/01/2012'},
    {
    
    'address': '5148 N CLARK', 'date': '07/04/2012'},
    {
    
    'address': '5800 E 58TH', 'date': '07/02/2012'},
    {
    
    'address': '2122 N CLARK', 'date': '07/03/2012'},
    {
    
    'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
    {
    
    'address': '1060 W ADDISON', 'date': '07/02/2012'},
    {
    
    'address': '4801 N BROADWAY', 'date': '07/01/2012'},
    {
    
    'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]

Angenommen, Sie möchten Datenblöcke durchlaufen, die nach Datum gruppiert sind. Dazu müssen Sie zunächst nach dem angegebenen Feld (in diesem Fall Datum) sortieren und dann die Funktion itertools.groupby() aufrufen.

from operator import itemgetter from itertools import groupby
# Sort by the desired field first
rows.sort(key=itemgetter('date'))
# Iterate in groups
for date, items in groupby(rows, key=itemgetter('date')):
print(date) for i in items:
print(' ', i)

Operationsergebnis:

07/01/2012
  {
    
    'date': '07/01/2012', 'address': '5412 N CLARK'}
  {
    
    'date': '07/01/2012', 'address': '4801 N BROADWAY'}
07/02/2012
  {
    
    'date': '07/02/2012', 'address': '5800 E 58TH'}
  {
    
    'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}
  {
    
    'date': '07/02/2012', 'address': '1060 W ADDISON'}
07/03/2012
  {
    
    'date': '07/03/2012', 'address': '2122 N CLARK'}
07/04/2012
  {
    
    'date': '07/04/2012', 'address': '5148 N CLARK'}
  {
    
    'date': '07/04/2012', 'address': '1039 W GRANVILLE'}

Die Funktion „groupby()“ durchsucht die gesamte Sequenz und findet eine Sequenz von Elementen mit demselben fortlaufenden Wert (oder demselben Wert, der von der angegebenen Schlüsselfunktion zurückgegeben wird). Bei jeder Iteration werden ein Wert und ein Iteratorobjekt zurückgegeben, das alle Objekte in der Gruppe generieren kann, deren Elementwerte alle dem oben genannten Wert entsprechen.

Ein sehr wichtiger Vorbereitungsschritt besteht darin, die Daten nach vorgegebenen Feldern zu sortieren. Da groupby() nur aufeinanderfolgende Elemente prüft, wird die Gruppierungsfunktion nicht die gewünschten Ergebnisse erzielen, wenn die Sortierung nicht vorher erfolgt.

Wenn Sie die Daten nur basierend auf dem Datumsfeld in einer großen Datenstruktur gruppieren und wahlfreien Zugriff ermöglichen möchten, ist es besser, defaultdict() zu verwenden, um ein Wörterbuch mit mehreren Werten zu erstellen.

from collections import defaultdict rows_by_date = defaultdict(list) for row in rows:
    rows_by_date[row['date']].append(row)

Sie können für jedes angegebene Datum problemlos auf die entsprechenden Datensätze zugreifen.

>>> for r in rows_by_date['07/01/2012']:
... print(r)
...
{
    
    'date': '07/01/2012', 'address': '5412 N CLARK'}
 {
    
    'date': '07/01/2012', 'address': '4801 N BROADWAY'}
>>>

Wenn Sie sich keine großen Gedanken über die Speichernutzung machen, wird diese Methode schneller ausgeführt, als zuerst zu sortieren und dann die Funktion „groupby()“ zu durchlaufen.

Ich denke du magst

Origin blog.csdn.net/m0_68635815/article/details/135442342
Empfohlen
Rangfolge