我试图创建一个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)
?)。