首页 > 解决方案 > Python 集允许添加重复的元组坐标而不识别存在的要删除的元组

问题描述

我正在使用一个集合来保存进化拓扑的 3D 元胞自动机脚本中相邻单元的单元中心的坐标。如果一个单元格是两个单元格的邻居,我不希望它的中心点被存储两次。

在一个循环中,我正在更新这个集合,既删除现在正在操作的邻居坐标,又随着我的拓扑结构的发展添加新的邻居。尽管删除/添加的元组与集合中存在的元组相同,但当我的集合中的元组条目未被识别为删除或避免重复添加时,我遇到了一个奇怪的问题。

我希望有人以前遇到过这种情况。我尝试使用演示代码复制此问题,认为这与我将数字四舍五入到 3 个十进制位置以允许识别 tupe 坐标有关,但是我无法在简短的代码中重新创建此问题以共享。因此,请查看此输出,您可以在其中看到多个重复项(每个坐标条目都是一个元组,因此类型不一致不是问题):

print(type(neighbor_cells))
neighbor_cells

>> set
>> {(-163.592, -173.592, 485.0),
(-163.592, -123.592, 485.0),
 (-163.592, -123.592, 485.0),
 (116.408, -93.592, 485.0),
 (136.408, -73.592, 495.0),
 (86.408, -103.592, 485.0),
 (-173.592, 36.408, 485.0),
 (-173.592, 36.408, 485.0),
 (-43.592, 126.408, 485.0),
 (126.408, -73.592, 495.0),
 (46.408, 56.408, 475.0),
 (-153.592, 166.408, 495.0),
 (-53.592, 126.408, 485.0),
 (-53.592, 126.408, 485.0),
 (156.408, 66.408, 485.0),
 (86.408, -143.592, 485.0),
 (-123.592, -103.592, 475.0),
 (-103.592, -73.592, 485.0),
 (156.408, 56.408, 475.0),
 (126.408, 106.408, 485.0),
 (76.408, 106.408, 475.0),
 (66.408, 166.408, 475.0),
 (-143.592, 96.408, 475.0),
...}

我尝试实现以下内容以检查是否可以手动识别重复项,但以下内容没有打印:

for i,s in enumerate(list(neighbor_cells)):
    for j,q in enumerate(list(neighbor_cells)):
        if s == q: print(s)

笔记

谢谢大家的建议!我知道省略代码并不理想,但我认为它太长且令人费解,没有任何用处,而且我无法编写可以做同样事情的示例代码。但是,我注意到了几件事,并从不同的意义上找到了针对此问题的 jancky 解决方案。

如果我确保添加的坐标是 np.array 类型的元组,例如不是列表,并且四舍五入到固定的小数位数,我就能够可靠地找到集合中的元组。

尽管在我的集合中进行了此修复和可靠的元组搜索,但仍有一个集合仍然不允许找到完全匹配的元组。经过多次尝试,我发现在创建元组之前从坐标中创建一个字符串可以添加到集合中并从中进行查询。例如:

my_tuple = tuple(str(coord))
my_set.add(my_tuple)
check_tuple = tuple(str(check_coord))
check_tuple in my_tuple

标签: pythonduplicatessettuplescoordinates

解决方案


没有代码可以告诉你问题,我给它一个案例,也许它是你的案例

class Coordinate(tuple):

    def __new__(cls, sequence):
        return tuple.__new__(cls, sequence)

    def __repr__(self):
        return '({:.3f}, {:.3f}, {:.3f})'.format(self[0], self[1], self[2])

point_1 = Coordinate((-163.592111, -123.592222, 485.592333))
point_2 = Coordinate((-163.592222, -123.592333, 485.592444))

lst = set((point_1, point_2))

它得到结果

>>> lst
{(-163.592, -123.592, 485.592), (-163.592, -123.592, 485.592)}

对于结果,似乎集合中有具有相同值的项目。实际上,它们是不同的值,但显示相同。


推荐阅读