Réduire de clés en python
Je suis en train de réfléchir à la manière la plus efficace de le faire en python.
Supposons que j'ai une liste de tuples:
[('dog',12,2), ('cat',15,1), ('dog',11,1), ('cat',15,2), ('dog',10,3), ('cat',16,3)]
Et supposons que j'ai une fonction qui prend deux de ces n-uplets et les combine:
def my_reduce(obj1, obj2):
return (obj1[0],max(obj1[1],obj2[1]),min(obj1[2],obj2[2]))
Comment puis-je effectuer un efficace, réduire les par la "clef" où est la clé ici pourrait être la première valeur, de sorte que le résultat final serait quelque chose comme:
[('dog',12,1), ('cat',16,1)]
- vouliez-vous dire min(obj1[2],obj2[2])
- bonne prise, merci! Je l'ai fixée ci-dessus
- cela ressemble à quelque chose de bien adapté pour les pandas
- Hey @mgoldwasser, 2 ans de retard, mais voici une autre façon: stackoverflow.com/a/48343896/5858851. BTW, je suis l'ancien collègue de travail, vous pensez que je suis.
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez utiliser votre
my_reduce
etreduce
, vous pouvez le faire de cette façon. Il est assez court, en fait:Préparation:
Solution:
De sortie:
Sinon, si vous avez pandas installé:
Pour obtenir le format d'origine:
Je ne pense pas que
reduce
est un bon outil pour ce travail, parce que vous devrez d'abord utiliser itertools ou similaires à groupe de la liste par la clé. Sinon, vous serez en comparantcats
etdogs
et tout l'enfer va barder!Au lieu d'une simple boucle est fine:
Alors si vous voulez le format d'origine de retour:
Note va détruire l'ordre de la liste originale. Si vous souhaitez conserver l'ordre les touches apparaissent en premier dans la, initialiser la sortie avec une
OrderedDict
à la place.si vous voulez vraiment utiliser de réduire je pense que cela fonctionne (il vous donne un dict arrière au lieu d'une liste, mais meh)
Je pense que les deux autres solutions sont mieux cependant