3
votes

Trier le dict par clé et récupérer la valeur

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.


4 commentaires

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.


5 Réponses :


0
votes

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()))


5 commentaires

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



0
votes

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 :)


0 commentaires

0
votes

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 ​​()))


0 commentaires

0
votes

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


0 commentaires

0
votes

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'}


0 commentaires