作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看过 the related question ,但我不能将 frozenset
用于我的内部集。我希望一切都是可变的。
据我了解,Python 为所有内容提供了一个 ID ,那么为什么它不能使用 as its hash ?我需要维护对所有内部集的引用列表,即使它们发生变化也是如此。
编辑: 好的,我明白为什么,但在这种情况下它会更可取,因为我只关心引用相等性,而不关心值相等性。
我该怎么做?
你是 要问“为什么”,所以我会给你一些代码:
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'
最佳答案
决定改用集合字典。
def remove_captured(self):
cdict = {}
cid = 0
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] and chains[m, n] != chains[m, n - 1]:
del_id = chains[m, n - 1]
cdict[chains[m, n]].update(cdict[del_id])
for c in cdict[del_id]:
chains[c] = chains[m, n]
del cdict[del_id]
elif stone == self[m, n - 1]:
chains[m, n] = chains[m, n - 1]
else:
cdict[cid] = set()
chains[m, n] = cid
cid += 1
cdict[chains[m, n]].add((m, n))
chains._print()
pprint(cdict)
它不是很漂亮,因为在使用它之前我总是必须在字典中查找该集合,但它似乎有效。
输入:
0 . W W W W
1 W B B B .
2 . . . W .
3 . B B W W
4 . . B W .
0 1 2 3 4
输出:
0 0 1 1 1 1
1 2 3 3 3 4
2 5 5 5 6 4
3 5 7 7 6 6
4 5 5 7 6 8
0 1 2 3 4
{0: set([(0, 0)]),
1: set([(0, 1), (0, 2), (0, 3), (0, 4)]),
2: set([(1, 0)]),
3: set([(1, 1), (1, 2), (1, 3)]),
4: set([(1, 4), (2, 4)]),
5: set([(2, 0), (2, 1), (2, 2), (3, 0), (4, 0), (4, 1)]),
6: set([(2, 3), (3, 3), (3, 4), (4, 3)]),
7: set([(3, 1), (3, 2), (4, 2)]),
8: set([(4, 4)])}
关于python - 如何保养一套套?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11480453/
我是一名优秀的程序员,十分优秀!