0
votes

Suppression d'un article du dictionnaire dans PY3 lors de l'itération

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)


4 commentaires

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?


3 Réponses :


0
votes

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)


0 commentaires

1
votes

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"]
}


0 commentaires

2
votes

Les éléments Les éléments 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 a fait en python2). Donc la correspondance 2 -> 3, lorsque D est un dict est:

  • D.ITEMS () -> Liste (D.Items ())
  • d.iteritems () -> d.items ()

    Ceci explique pourquoi le code a fonctionné dans Python2 et ne fonctionne plus dans Python3.

    afin de garder le comportement Python 2, vous devez construire explicitement une liste indépendante: < Pré> xxx


0 commentaires