Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python集允许添加重复的元组坐标,而不识别要删除的元组_Python_Duplicates_Set_Tuples_Coordinates - Fatal编程技术网

Python集允许添加重复的元组坐标,而不识别要删除的元组

Python集允许添加重复的元组坐标,而不识别要删除的元组,python,duplicates,set,tuples,coordinates,Python,Duplicates,Set,Tuples,Coordinates,我使用一个集合来保存进化拓扑的3D细胞自动机脚本中相邻细胞的细胞中心坐标。如果一个单元格与两个单元格相邻,我不希望它的中心点被存储两次 在一个循环中,我正在更新这个集合,删除当前正在操作的邻居坐标,并随着拓扑的发展添加新的邻居。我遇到了一个奇怪的问题:尽管移除/添加的元组与集合中存在的元组相同,但集合中的元组条目没有被识别以进行删除或避免重复添加 我希望以前有人碰到过这件事。我试图用一个演示代码来复制这一点,认为这与我将数字四舍五入到3个decmila位置有关,以便能够识别tupe坐标,但是我无

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

在一个循环中,我正在更新这个集合,删除当前正在操作的邻居坐标,并随着拓扑的发展添加新的邻居。我遇到了一个奇怪的问题:尽管移除/添加的元组与集合中存在的元组相同,但集合中的元组条目没有被识别以进行删除或避免重复添加

我希望以前有人碰到过这件事。我试图用一个演示代码来复制这一点,认为这与我将数字四舍五入到3个decmila位置有关,以便能够识别tupe坐标,但是我无法在一个简短的代码中重新创建这个问题来共享。因此,请查看此输出,您可以在其中看到多个重复项(每个坐标条目都是元组,因此不存在类型不一致的问题):

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

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

谢谢大家的建议!我知道省略代码并不理想,但它太长,太复杂,没有任何用处,我想,我无法编写一个示例代码来做同样的事情。然而,我注意到了一些事情,并在不同的意义上为这个问题找到了一个简陋的解决方案

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

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

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

并没有代码告诉你们这个问题,我给你们一个例子,也许是你们的例子

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)}

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

没有代码向您显示问题,我给出了一个案例,可能是您的案例

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)}

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

查看用于将元组添加到集合中的代码会很有用。然而,我用你显示的数字做了一个简单的实验,我的集合确实删除了重复的数据。如果看不到代码,就很难说为什么集合不能将相同的元组识别为相同的元组

作为建议,当我运行我的实验时,我首先将元组添加到一个变量中,然后添加集合,从而将元组添加到集合中。我没有将元组直接添加到集合中

t1 = (d1, d2, d3)
set.add(t1)

另外,在将数字添加到元组时,我使用了
round()
对数字进行四舍五入。仔细检查函数及其在代码中的使用位置,因为这可能是集合将两个相同元组视为不同的原因(用于删除重复元组和删除元组)。

查看用于将元组添加到集合中的代码会很有用。然而,我用你显示的数字做了一个简单的实验,我的集合确实删除了重复的数据。如果看不到代码,就很难说为什么集合不能将相同的元组识别为相同的元组

作为建议,当我运行我的实验时,我首先将元组添加到一个变量中,然后添加集合,从而将元组添加到集合中。我没有将元组直接添加到集合中

t1 = (d1, d2, d3)
set.add(t1)

另外,在将数字添加到元组时,我使用了
round()
对数字进行四舍五入。请仔细检查函数及其在代码中的使用位置,因为这可能是集合将两个相同元组视为不同的原因(用于删除重复元组和删除元组)。

感谢您的回复!我检查了我放入集合的内容,每次都是一个numpy数组的元组,四舍五入到小数点后3位,所以我很困惑,如果每次都是相同格式的相同类型,为什么允许重复。所以最好有一个代码来显示如何获取数据并将其放入集合。感谢您的回复!我检查了我放入集合的内容,每次都是numpy数组的元组,四舍五入到小数点后3位,所以我很困惑,如果每次都是相同格式的相同类型,为什么允许重复。所以最好有一个代码来显示如何获取数据并将其放入集合。欢迎使用SOF!请在将项目添加到
集合的位置添加代码
您使用的是哪个NumPy版本?集合不允许重复。因此,您的坐标不是精确的副本。但它们是浮点值,不能可靠地比较浮点值是否相等。它们看起来可能四舍五入到3位小数,但这正是它们显示的方式。使用
round()
不会产生精确的四舍五入量,只能得到最接近的可表示的浮点近似值。谢谢大家。我意识到问题在于我的集合中坐标元组中存储的值的数据类型。我用不同的方法将这些坐标作为32位和64位浮点输入,因此根据浮点类型,集合是否允许“重复”。我现在明白了,这些都不是真的复制品。欢迎来到SOF!请在将项目添加到
集合的位置添加代码
您使用的是哪个NumPy版本?集合不允许重复。因此,您的坐标不是精确的副本。但它们是浮点值,不能可靠地比较浮点值是否相等。它们看起来可能四舍五入到3