向set中添加相同的元组会创建插入的元组的排列



我试图创建一个5元素元组的唯一安排,其中每个元素本身是两个整数的元组。为了确定给定的排列是否唯一,我将其添加到一个集合中,并期望该集合将确定先前添加的排列是否与新元组相同。下面的代码是执行

操作的代码
def generate_each_orientation(self):
self.orientations = set()
working = self.raw[:]
Piece.normalize(working)
for i in range(8):
print("Iteration ",i+1)
print("List to be added to set: ", working)
self.orientations.add(tuple(working))
print("Set after adding list:n",self.orientations)
[Tile.rotate(t) for t in working]
Piece.normalize(working)
if i == 3:
[Tile.flip(t) for t in working]
Piece.normalize(working)

第一次传递生成以下输出;

Iteration  1
List to be added to set:  [(0, 0), (1, 0), (1, -1), (1, 1), (2, 0)]
Set after adding list:
{((0, 0), (1, 0), (1, -1), (1, 1), (2, 0))}

由于集合为空,因此第一个元组被正确添加。循环的第二次迭代产生

Iteration  2
List to be added to set:  [(0, 0), (1, 0), (1, -1), (1, 1), (2, 0)]
Set after adding list:
{((1, -1), (1, 0), (2, 0), (0, 0), (1, 1)), ((0, 0), (1, 0), (1, -1), (1, 1), (2, 0))}

在这里,尽管输入列表与第一次传递的列表相同,但将其添加到set中会得到第二个项,其中元组的元素已经重新排列。重复以上6次会导致相同的行为以包含8个元素的集合结束,每个元素在元组中具有不同的元素排列,而它应该只有一个元组。

set add方法内部可能发生了什么?它是否将元组拆开并以不同的顺序重新组合在一起?我能做些什么来防止这种情况发生?

查看添加列表后的集合:

{((0, 0), (1, 0), (1, -1), (1, 1), (2, 0))}

元素是一个元组,里面有5个元组

我认为你应该扁平化集合结构(如果working是元组列表,可能只是替换为self.orientations.update(working)?)。

最新更新