関連する質問を見ましたfrozenset
が、インナーセットにを使用できません。すべてを変更可能にしたい。
私が理解しているように、PythonはすべてにIDを与えるのに、なぜそれをハッシュとして使用できないのでしょうか。すべての内部セットへの参照のリストは、変更されても維持する必要があります。
編集:わかりました。理由はわかりますが、この場合は、値の平等ではなく、参照の平等のみを考慮しているため、望ましいでしょう。
これどうやってするの?
あなたは「なぜ」と尋ねるつもりなので、私はあなたにいくつかのコードを与えるでしょう:
def remove_captured(self):
all_chains = set()
chains = Grid(self.rows, self.cols)
for m, n, stone in self.enumerate():
if stone == self[m - 1, n]:
chains[m, n] = chains[m - 1, n]
if stone == self[m, n - 1]:
all_chains.discard(chains[m, n - 1])
chains[m, n].update(chains[m, n - 1])
for s in chains[m, n - 1]:
chains[s] = chains[m, n]
elif stone == self[m, n - 1]:
chains[m, n] = chains[m, n - 1]
else:
chains[m, n] = set()
all_chains.add(chains[m, n])
chains[m, n].add((m,n))
chains._print()
print all_chains
私は基本的にゲームボードを持っているので、ボード上のピースをグループ(または「チェーン」)に分割したいと思います。上記のコードは、追加するまでは正常に機能all_chains
します。すべてのセットが作成されますが、ボード全体を再度繰り返すことなく、作成された各セットにアクセスする方法はありません。
では、作成されたすべてのセットのリストを維持するにはどうすればよいですか?セットも削除する必要があることに注意してください(これが、外部セットに別のセットを使用したい理由です)。
参照をラップするweakref.ref()
ことも機能しませんでした:
all_chains.add(weakref.ref(chains[m, n])) # TypeError: unhashable type: 'set'