Maison  >  Article  >  développement back-end  >  Voici un titre approprié pour votre article, en gardant à l'esprit le format de la question : Comment regrouper des paires de données par type en Python : solutions efficaces avec « defaultdict » et « itertools.groupby »

Voici un titre approprié pour votre article, en gardant à l'esprit le format de la question : Comment regrouper des paires de données par type en Python : solutions efficaces avec « defaultdict » et « itertools.groupby »

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 07:06:03765parcourir

Here's a suitable title for your article, keeping the question format in mind: 

How to Group Data Pairs by Type in Python: Efficient Solutions with `defaultdict` and `itertools.groupby`

Python Group By

Problème :

Étant donné un ensemble de paires de données où le premier élément est la valeur et le le deuxième élément est le type, regroupez-les en fonction du type.

Exemple :

input = [
  ('11013331', 'KAT'),
  ('9085267', 'NOT'),
  ('5238761', 'ETH'),
  ('5349618', 'ETH'),
  ('11788544', 'NOT'),
  ('962142', 'ETH'),
  ('7795297', 'ETH'),
  ('7341464', 'ETH'),
  ('9843236', 'KAT'),
  ('5594916', 'ETH'),
  ('1550003', 'ETH'),
]

Résultat souhaité :

result = [
  {
    'type': 'KAT',
    'items': ['11013331', '9843236']
  },
  {
    'type': 'NOT',
    'items': ['9085267', '11788544']
  },
  {
    'type': 'ETH',
    'items': ['5238761', '962142', '7795297', '7341464', '5594916', '1550003']
  },
]

Solution :

Étape 1 : Créer un dictionnaire

  • Utilisez le collections.defaultdict pour créer un dictionnaire où les clés sont des types d'éléments et les valeurs sont des listes pour stocker des valeurs.
  • Pour chaque paire de données, ajoutez la valeur à la liste correspondant à son type.

Étape 2 : Convertir en Format attendu

  • Convertissez le dictionnaire au format attendu en itérant sur ses éléments et en créant des dictionnaires avec les clés « type » et « éléments ».

Exemple de code :

<code class="python">from collections import defaultdict

res = defaultdict(list)
for v, k in input:
    res[k].append(v)

output = [{'type': k, 'items': v} for k, v in res.items()]</code>

Solution alternative utilisant itertools.groupby :

Remarque :Cette approche nécessite que l'entrée soit triés.

  • Triez les paires de données en fonction de leurs types.
  • Utilisez itertools.groupby pour regrouper les paires de données par type.
  • Parcourez les éléments groupés pour créer le format de sortie souhaité.

Exemple de code :

<code class="python">from itertools import groupby, itemgetter

sorted_input = sorted(input, key=itemgetter(1))

groups = groupby(sorted_input, key=itemgetter(1))
output = [{'type': k, 'items': [x[0] for x in v]} for k, v in groups]</code>

Remarque sur la commande des clés :

  • Dans les versions Python antérieures à 3.7, l'ordre d'insertion n'est pas garanti pour les dictionnaires. Pour que l'ordre reste cohérent avec l'entrée, utilisez collections.OrderedDict.
  • Dans Python 3.7 et versions ultérieures, les dictionnaires conservent l'ordre d'insertion par défaut.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn