AttributeError: no se puede establecer el atributo en Python

Aqui esta mi codigo

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 

En la última línea no puedo establecer los items[node.ind].v valor en node.v como quiero, y node.v el error

 "AttributeError: can't set attribute" 

No sé qué está mal, pero debe ser algo basado en la syntax, ya que el uso de sentencias como node.v+=1 también muestra el mismo error. Soy nuevo en Python, así que sugiera una manera de hacer posible el cambio anterior.

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

(Nota: No se desanime a usar esta solución debido al subrayado principal en la función _replace. Específicamente para nameduuple, algunas funciones tienen un subrayado principal que no es para indicar que están destinadas a ser “privadas”)

namedtuple son inmutables, al igual que las tuplas estándar. Tienes dos opciones:

  1. Utilice una estructura de datos diferente, por ejemplo, una clase (o simplemente un diccionario); o
  2. En lugar de actualizar la estructura, reemplázala.

El primero se vería así:

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

Y este último:

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

Edición : si desea lo último, la respuesta de Ignacio hace lo mismo de manera más ordenada utilizando la funcionalidad horneada.