#1 Le 23/11/2017, à 10:46
- Hizoka
[Python3] Probleme de boucle sur un dictionnaire
Bonjour à vous,
je suis confronté à un questionnement, j'ai un dico qui contient de nombreux sous dictionnaires.
A la fin de mon travail je veux afficher le tout.
Je fais une petite boucle qui renvoie un truc du genre :
+> key
=> value
+> key
=> value
=> value
+> key
=> value
mais vu le bordel, je veux ordonner ça, j'utilise donc sorted(Dico) pour chaque niveau.
Le souci étant que mes clés peuvent être de type int ou str, sorted ne fonctionne pas.
Du coup, je me dis que je vais changer le type des clés avant d'utiliser sorted et c'est là que je ne pige pas.
Partons de l'exemple :
Dico = {91830:91830, 86515:86515, 91935:91935, 88765:88765, 87990:87990, 86180:86180}
for key in Dico.keys():
if type(key) is not str:
Dico[str(key)] = Dico.pop(key)
print(Dico)
{86180: 86180, '91830': 91830, '86515': 86515, '91935': 91935, '88765': 88765, '87990': 87990}
Pourquoi y a-t-il un seul élément qui ne soit pas traité ?!
Si je relance une 2e fois cette même boucle, ça fonctionne...
Je présume que la bonne façon de faire est de passer par un 2e dictionnaire :
Dico = {91830:91830, 86515:86515, 91935:91935, 88765:88765, 87990:87990, 86180:86180}
Dico2 = Dico.copy()
for key in Dico.keys():
if type(key) is not str:
Dico2[str(key)] = Dico2.pop(key)
print(Dico2)
{'91830': 91830, '86515': 86515, '91935': 91935, '88765': 88765, '87990': 87990, '86180': 86180}
Modifier le dictionnaire dans une boucle se traitant lui même n'est pas une bonne idée... mais je n'ai pas de message d'erreur et surtout ça marche pour tout sauf une valeur.
Du coup, j'aurais aimé une explication sur le pourquoi
Merci à vous !
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 23/11/2017, à 12:43
- pingouinux
Re : [Python3] Probleme de boucle sur un dictionnaire
Bonjour Hizoka,
Personnellement, je ferais ceci :
list_k=tuple(Dico.keys())
for key in list_k:
if not isinstance(key,str):
pop_k = Dico.pop(key)
Dico[str(key)] = pop_k
print(Dico)
Hors ligne
#3 Le 23/11/2017, à 12:49
- Hizoka
Re : [Python3] Probleme de boucle sur un dictionnaire
Merci de ta réponse
C'est assez proche de me solution avec 2 dico.
c'est rassurant
Mais isinstance est peut-être mieux à utiliser.
Mais sinon, pas d'idée sur la raison du probleme ?
Dernière modification par Hizoka (Le 23/11/2017, à 12:49)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 23/11/2017, à 13:19
- pingouinux
Re : [Python3] Probleme de boucle sur un dictionnaire
Je n'ai pas réussi à reproduire ton problème, ni en python2, ni en python3, mais dans ce dernier cas, la boucle est parcourue plus de 6 fois.
Je préfère éviter ceci (boucle sur un truc qui bouge)
for key in Dico.keys():
et cela (modif de Dico à droite et à gauche)
Dico[str(key)] = Dico.pop(key)
Hors ligne
#5 Le 23/11/2017, à 14:13
- Hizoka
Re : [Python3] Probleme de boucle sur un dictionnaire
Je viens de tester avec python2.7 et ça fonctionne...
sous python3.6, je confirme mon problème.
merci pour les conseils.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne