Tout d'abord, j'essaie de mettre à jour mon code de Python 2 à Python 3. J'essaie de mettre à jour un dictionnaire, je mettais à jour le nom des clés et je sais que les clés que je n'utilise pas. Je reçois une erreur: Dictionnaire a changé la taille lors de l'itération
Exemple de code: P>
for k, v in self.v_signals.items():
for jj in self.On_Signal_Option["levels_run"]:
new_key = str(k) + str(jj)
self.v_signals[new_key] = self.v_signals[k]
self.v_signals.pop(k, None)
3 Réponses :
Copier les éléments dans une liste pour l'itération
for k, v in list(self.v_signals.items()):
for jj in self.On_Signal_Option["levels_run"]:
new_key = str(k)+str(jj)
self.v_signals[new_key] = self.v_signals[k]
self.v_signals.pop(k, None)
Ceci créera un nouveau dictionnaire.
self.v_signals = {
str(k) + str(jj): v
for k, v in self.v_signals.items()
for jj in self.On_Signal_Option["levels_run"]
}
Les éléments Ceci explique pourquoi le code a fonctionné dans Python2 et ne fonctionne plus dans Python3. p> afin de garder le comportement Python 2, vous devez construire explicitement une liste indépendante: P> < Pré> xxx pré> p> Les éléments code> ont changé entre Python 2 et 3. dans Python2, il construit une liste lorsqu'il est dans Python3, il donne simplement un itérateur sur le dictionnaire (que iteritems code> a fait en python2). Donc la correspondance 2 -> 3, lorsque D est un dict code> est:
construire un nouveau dictionnaire au lieu de modifier l'existant
Vous ne voulez presque jamais muter le Datastructure que vous êtes itération pendant l'itération, quel que soit le langage de programmation que vous utilisez. Prenez les conseils dans le premier commentaire - cela vous fera gagner du temps et de la douleur!
@alfasin, j'ai tendance à être d'accord avec vous, mais parfois, vous ne voulez pas surcharger avec tant de variables dupliquées / similaires.
Est-ce que cela répond à votre question? Comment supprimer des articles d'une liste lors de l'itération?