AtsortingbuteError: impossible de définir l’atsortingbut dans python

Voici mon code

N = namedtuple("N", ['ind', 'set', 'v']) def solve() items=[] stack=[] R = set(range(0,8)) for i in range(0,8): items.append(N(i,R,8)) stack.append(N(0,R-set(range(0,1)),i)) while(len(stack)>0): node = stack.pop() print node print items[node.ind] items[node.ind].v = node.v 

Dans la dernière ligne, je ne peux pas définir la valeur des items[node.ind].v node.v sur node.v comme je le souhaite et node.v l’erreur

 "AtsortingbuteError: can't set atsortingbute" 

Je ne sais pas ce qui ne va pas, mais cela doit être basé sur la syntaxe, car utiliser des instructions comme node.v+=1 montre également la même erreur. Je suis nouveau sur Python, alors s’il vous plaît, suggérez un moyen de rendre le changement ci-dessus possible.

 items[node.ind] = items[node.ind]._replace(v=node.v) 

(Remarque: ne vous découragez pas d’utiliser cette solution en raison du trait de soulignement principal dans la fonction _replace. Plus précisément, certaines fonctions de la fonction namedtuple ont un trait de soulignement principal qui n’est pas destiné à être “privé”)

namedtuple s sont immuables, tout comme les tuples standard. Vous avez deux choix:

  1. Utiliser une structure de données différente, par exemple une classe (ou simplement un dictionnaire); ou
  2. Au lieu de mettre à jour la structure, remplacez-la.

Le premier ressemblerait à:

 class N(object): def __init__(self, ind, set, v): self.ind = ind self.set = set self.v = v 

Et ce dernier:

 item = items[node.ind] items[node.ind] = N(item.ind, item.set, node.v) 

Edit : si vous voulez le dernier, la réponse d’Ignacio fait la même chose de manière plus nette en utilisant la fonctionnalité cuite au four.