bon après-midi.
Je suis désolé si ma question peut sembler idiote ou si elle a déjà été postée (je l'ai regardée mais je ne semblais pas trouver rien. Si je me trompe, s'il vous plaît laissez-moi savoir : Je suis nouveau ici et je ne suis peut-être pas le meilleur à la recherche des questions correctes). P>
Je me demandais s'il était possible de supprimer (pop) d'un article générique d'un dictionnaire à Python. L'idée est venue de l'exercice suivant: p>
écrire une fonction pour trouver la somme des valeurs dans un dictionnaire donné. P> Sommation
Dictionary.Values () Code>, Création d'une variable pour la somme et itérale à travers la dicte et la mise à jour, etc. Mais je essayait de le résoudre avec une récursion, avec quelque chose comme: p>xxx pré> Le problème avec cette idée est que nous ne savons pas a priori em> qui pourrait Soyez la "première" clé d'un dict puisqu'il est non ordonné: si c'était une liste, l'index 0 aurait été utilisé et tout aurait fonctionné. Depuis que je me fiche de l'ordre dans lequel les articles sont sautés, il suffirait de disposer d'un moyen de supprimer l'un des éléments (un élément "générique"). Pensez-vous que quelque chose comme ceci est possible ou devrais-je utiliser nécessairement une variable auxiliaire, perdre tout le point de l'utilisation de la récursivité, dont l'avantage serait un code très concis et simple? P>
i réellement trouvé la solution suivante, qui, comme vous pouvez, comme vous pouvez le constater, rend le code plus complexe et plus difficile à lire: je pense que cela pourrait toujours être intéressant et utile s'il y avait une solution intégrée, simple et directe à ce problème particulier de la suppression de la "Premier" article d'un dict, bien que de nombreuses solutions alternatives "artificielles" puissent être trouvées. p>
xxx pré> Je vous laisserai ici un exemple simple dictionnaire sur lequel la fonction pourrait être appliqué, si vous voulez effectuer des tests simples. P>
ex_dict = {"milk":5, "eggs":2, "flour": 3}
3 Réponses :
Il supprime le premier élément du dictionnaire P> ex_dict.popitem () code> p>
Corriger. Il retourne un tuple (clé, valeur). Donc, de laisser fonctionner la fonction, vous devez vous référer au deuxième élément du tuple: retour Dictionary.popitem () [1] + total_sum (Dictionnaire) Code>
Merci. Cela me donnait une erreur d'abord car, différemment de "pop", il renvoie la clé / valeur de couple entière dans un tuple, et je l'utilisais exactement comme POP qui ne renvoie que la valeur. Maintenant tout fonctionne tout va bien!
Vous pouvez faire des articles d'une dicte, mais il est détruit dans le processus. Si vous souhaitez trouver la somme des valeurs dans un dict, il est probablement plus facile de simplement utiliser une compréhension de la liste.
sum([v for v in ex_dict.values()])
Merci pour la réponse, mais comme je disais à marquer dans les commentaires, c'était plus comme une curiosité quant à la possibilité d'un "comportement par défaut" pour "pop", qui permet d'obtenir le premier élément par défaut même sans connaître le clé. Le contexte particulier de la somme des valeurs, ici, est un peu contracté comme une information de base pour contextualiser le problème et fournir un exemple pratique.
au lieu de penser en termes de Cela ne répond pas vraiment à la question sur les valeurs de sautes, mais cela ne devrait vraiment pas être une option Parce que vous ne pouvez pas détruire la dicte d'entrée et effectuer une copie juste pour obtenir la somme, comme vous l'avez noté dans le commentaire, pourrait être assez coûteux. P> Utilisation de POP code> ping valeurs, une approche plus pythonique (aussi loin est la récursive est Pythonic ici) est d'utiliser un itérateur. Vous pouvez transformer les valeurs de la dict en itérateur et utiliser cela pour la récursivité. Ce sera une mémoire efficace et vous donnera une condition d'arrêt très propre pour votre récursivité: PopItem () Code> serait presque le même code. Vous venez d'attraper une exception différente et d'attendre le tuple de la pop. (Et bien sûr, vous comprenez que vous avez vidé la dict comme effet secondaire): p>
Un problème plus important avec c'est que vous détruisez le dictionnaire dans le processus. C'est inacceptable la plupart du temps.
Ouais, mais vous pouvez éviter cela en passant à la fonction une copie du dict, vous êtes vraiment intéressé. Le nouveau problème serait maintenant que dans un contexte de grandes dimensions (science des données, etc.), cela pourrait être tout à fait inefficace. Quoi qu'il en soit, c'était beaucoup plus une curiosité et de toute façon que cette fonction spécifique était un peu une "excuse" pour mettre en évidence le problème plus "générique" de la recherche d'une fonction avec les mêmes caractéristiques que "pop", mais cela peut faire sauter le premier article même sans connaître sa clé.