Maison >développement back-end >Tutoriel Python >Comment regrouper efficacement des données en Python en fonction d'une clé spécifique, et quelles sont les différentes méthodes disponibles pour cette tâche ?
En Python, regrouper les données par une clé spécifique implique d'organiser les éléments en fonction d'un attribut commun. Ceci peut être réalisé grâce à diverses méthodes, offrant des solutions efficaces pour les grands ensembles de données. Explorons comment regrouper efficacement les données.
Considérons un scénario dans lequel nous avons un ensemble de paires de données et l'objectif est de les regrouper en fonction de leur type. Pour ce faire, nous pouvons exploiter la classe collections.defaultdict. Il crée un dictionnaire dans lequel les clés manquantes sont automatiquement initialisées avec les valeurs par défaut, nous permettant d'ajouter des éléments à ces clés.
<code class="python">from collections import defaultdict input = [ ('11013331', 'KAT'), ('9085267', 'NOT'), ('5238761', 'ETH'), ('5349618', 'ETH'), ('11788544', 'NOT'), ('962142', 'ETH'), ('7795297', 'ETH'), ('7341464', 'ETH'), ('9843236', 'KAT'), ('5594916', 'ETH'), ('1550003', 'ETH'), ] res = defaultdict(list) for v, k in input: res[k].append(v) print([{ 'type': k, 'items': v } for k, v in res.items()])</code>
Sortie :
[{'items': ['9085267', '11788544'], 'type': 'NOT'}, {'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}, {'items': ['11013331', '9843236'], 'type': 'KAT'}]
Une autre approche consiste à utiliser itertools.groupby. Cette fonction nécessite que les entrées soient préalablement triées. Il génère des groupes d'éléments consécutifs où les valeurs de la clé spécifiée sont les mêmes.
<code class="python">import itertools from operator import itemgetter sorted_input = sorted(input, key=itemgetter(1)) groups = itertools.groupby(sorted_input, key=itemgetter(1)) print([{ 'type': k, 'items': [x[0] for x in v]} for k, v in groups])</code>
Sortie :
[{'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}, {'items': ['11013331', '9843236'], 'type': 'KAT'}, {'items': ['9085267', '11788544'], 'type': 'NOT'}]
Avant Python 3.7, les dictionnaires ne préservaient pas l'ordre d'insertion. Pour résoudre ce problème, collections.OrderedDict peut être utilisé pour conserver l'ordre des paires clé-valeur.
<code class="python">from collections import OrderedDict res = OrderedDict() for v, k in input: if k in res: res[k].append(v) else: res[k] = [v] print([{ 'type': k, 'items': v } for k, v in res.items()])</code>
Cependant, dans Python 3.7 et versions ultérieures, les dictionnaires réguliers préservent l'ordre d'insertion, ce qui rend OrderedDict inutile.
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!