ここに私のコードがあります
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
最後の行では、items[node.ind].v
値をnode.v
に設定することはできません。エラーが発生しています
"AttributeError: can't set attribute"
何が悪いのかわかりませんが、node.v+=1
のようなステートメントを使用しても同じエラーが表示されるため、構文に基づいている必要があります。私はPythonが初めてなので、上記の変更を可能にする方法を提案してください。
items[node.ind] = items[node.ind]._replace(v=node.v)
(注:関数_replaceの先頭にアンダースコアがあるため、このソリューションを使用することをお勧めしません。具体的には、namedtupleの一部の関数には、「プライベート」であることを示すためではない先頭のアンダースコアがあります)
namedtuple
sは、標準のタプルのように不変です。次の2つの選択肢があります。
前者は次のようになります。
class N(object):
def __init__(self, ind, set, v):
self.ind = ind
self.set = set
self.v = v
そして後者:
item = items[node.ind]
items[node.ind] = N(item.ind, item.set, node.v)
編集:後者が必要な場合、Ignacioの答えは、ベイクイン機能を使用して同じことをよりきちんと行います。