Fonction sorted() - HELP

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour !

Voici mon soucis : J’utilise un dictionnaire afin de stocker un graphe en mémoire. Chaque clé du dictionnaire représente le nom du nœud et est associé à un set() contenant tous les nœuds en relation avec lui. Jusque là, c’est simple ^^

J’aimerais pouvoir itérer sur chaque noeud de ce dictionnaire mais en donnant priorité au noeuds possédant un grand nombre de relations. J’ai donc récupéré une liste de clé via la fonctions dict.keys(). Il me reste à trier cette liste en fonction de la taille de chaque set() contenant dans le dictionnaire à cette clé.

Et donc voici mon problème j’ai essayé ceci : sorted(keys, key=len(graph[keys]) Comme vous l’aurez compris/remarqué, cela ne fonctionne pas.

Comment dois-je m’y prendre pour arriver au résultat voulu AVEC CETTE FONCTION. (Pour éviter de devoir implémenter moi même une fonction de tri).

D’avance merci !

Édité par Aabu

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

Si j’ai bien compris ton problème, il suffit de passer une lambda au paramètre key. Ça donne

1
sorted(keys, key=lambda k:len(graph[k]))

I don’t mind that you think slowly, but I do mind that you are publishing faster. — W. Pauli

+2 -0

Premiere chose : itérer sur les clés est le fonctionnement par défaut des dico. Donc pas besoin d’utiliser .keys(), tu peux directement mettre le dico.

Ensuite, que va tu faire de cette liste trié ? Tu n’as besoin vraiment que des clés ? Car sinon tu peux utiliser .values() si ce qui t’intéresse est uniquement les valeurs (tes sets) ou .items() si tu veux les deux :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
dico = {'key1': {1, 2}, 'key2': {42, 1337, 9}}

# tu veux justes les clés :
for key in sorted(dico, key=lambda k: len(dico[k]):
    print key
# ou plus propre je trouve :
for key, _ in sorted(dico.items(), key=lambda e: len(e[1])):
    print key

# si tu as juste besoin des valeurs (les sets)
for value in sorted(dico.values(), key=len):
    print value

# tu as besoin des deux :
for key, value in sorted(dico.items(), key=lambda e: len(e[1])):
    print key, '=>', value

En python on a tendance à itérer sur ce qu’on a besoin. Ce n’est pas parce qu’un dico est accessible par des clés que tu ne peux pas itérer sur les valeurs. Si ton opération ne fait pas intervenir le nom, itere sur les valeurs. Si tu as besoin des deux, itere sur les deux directement !

Édité par Kje

+3 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte