Compte tenu des scores = {0.0: "bob", 5.2: "alex", 2.8: "carl"}
Pour obtenir la sortie ["bob", "carl", "alex"]
Je peux faire print ([scores [key] for key in sorted (scores.keys ())])
Est-ce la meilleure façon (la plus "pythonique")? Je pensais que je pourrais utiliser scores.items () en conjonction avec sorted (key = ...) pour éviter la recherche dans le dictionnaire, mais je ne sais pas ce que le paramètre clé serait.
5 Réponses :
si vous insistez pour utiliser .items () , l'argument clé est key = lambda t: t [0] , mais dans ce cas key = lambda t: t fonctionne de la même manière (mais rompt les liens par la valeur). t est utilisé comme clé par défaut, vous n'avez donc pas besoin d'en spécifier une:
print(
list(list(zip(*sorted(scores.items())))[1])
)
sorties:
[(0.0, 'bob'), (2.8, 'carl'), (5.2, 'alex')]
maintenant pour obtenir une liste de valeurs, vous pouvez "décompresser" comme ceci:
scores = {0.0: "bob", 5.2: "alex", 2.8: "carl"}
print(sorted(scores.items()))
Vous n'avez pas besoin d'une clé pour le tri dans ce cas.
Je voulais dire t [0], mais même dans ce cas, je n'ai pas vraiment besoin d'une clé
Si vous voulez trier les éléments , je pense que vous devriez faire next (zip (* sorted (scores.items ()))) .
L'OP demandait seulement une liste de valeurs du dict original, pas une liste de tuples clé / valeur.
oh d'accord, j'ajouterai ça
L'itération sur dict utilisera toujours les clés, vous n'avez donc pas à utiliser la méthode .keys () .
Essayez également ne pas utiliser d'espace après et avant les parenthèses .
scores = {0.0: "bob", 5.2: "alex", 2.8: "carl"}
print(list(map(scores.get, sorted(scores))))
Pour une approche plus fonctionnelle, vous pouvez également utiliser:
scores = {0.0: "bob", 5.2: "alex", 2.8: "carl"}
print([scores[key] for key in sorted(scores)])
Mais votre solution est parfaitement correcte :)
Une autre approche serait de créer un objet générateur donnant les valeurs du dict, les convertir dans une liste, puis l'imprimer.
print (list (val pour val dans scores.values ()))
Veuillez essayer ce code sous le contenu du code, il sera trié dict par clé.
scores = { 0.0: "bob", 5.2: "alex", 2.8: "carl"}
for key, value in sorted(scores.items(), key=lambda kv: kv[0], reverse=True):
print("%s: %s" % (key, value))
5.2: alex
2.8: carl
0.0: bob
Pour trier le dictionnaire selon ses clés et récupérer ses valeurs:
# This is your initial dictionary
scores = { 0.0: "bob", 5.2: "alex", 2.8: "carl"}
# This sorts your dictionary by it's keys as mentioned by x[0]
sorted_scores = {k:v for k, v in sorted(scores.items(), key=lambda x:x[0])}
# Now we are getting all the values in the sorted order and storing it in result
result = list(sorted_scores.values())
# Now, result will be:
['bob', 'carl', 'alex']
# Also sorted_scores will be:
{0.0: 'bob', 2.8: 'carl', 5.2: 'alex'}
La recherche de dictionnaire n'a pas de coût notable. Vos solutions sont parfaitement pythnoïques, mais vous pourrez peut-être la rendre plus coûteuse en modifiant les algorithmes ou peut-être la structure des données.
Oui, votre solution est bonne (le
.keys ()n'est cependant pas nécessaire).@ TigerhawkT3 bon cri, merci
Je pense que vous avez juste la bonne voie à suivre.