Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 smile
C'est assez proche de me solution avec 2 dico.
c'est rassurant tongue

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