您需要删除重复项,我们可以在这里使用set。
但是,我们需要找到一种方法来确定元组是否等于它们的反转形式,例如(1, 0) 等于(0, 1)。如果我们对此进行测试,我们会意识到它们本身是不相等的:
>>> (1, 0) == (0, 1)
False
如@A.J. Uppal 的另一个答案所示,我们可以在进行相等性检查之前排序元组:
>>> tuple(sorted((1, 0))) == tuple(sorted((0, 1)))
True
这表明根据我们的标准,元组相等。
此外,集合需要 hashable(不可变)类型,因此可以在此处使用元组。可变类型是不可散列的,不能与set一起使用。
我们可以在这里使用的另一种可散列类型是frozenset:
>>> frozenset((1, 0)) == frozenset((0, 1))
True
这可以用来删除任何个重复项:
>>> a = [(1,0),(2,3),(0,1),(4,6),(3,2)]
>>> set(frozenset(t) for t in a)
{frozenset({0, 1}), frozenset({4, 6}), frozenset({2, 3})}
>>> [tuple(s) for s in set(frozenset(t) for t in a)]
[(0, 1), (4, 6), (2, 3)]
但是,以上内容并不能维持秩序。如果我们想保持顺序,我们可以使用 set 来跟踪重复:
a = [(1,0),(2,3),(0,1),(4,6),(3,2)]
seen = set()
result = []
for tup in a:
fs = frozenset(tup)
if fs not in seen:
result.append(tup)
seen.add(fs)
print(result)
这给出了这个有序输出:
[(1, 0), (2, 3), (4, 6)]
注意:使用frozenset就是O(n),比O(nlogn)排序效率更高。对于较大的列表,我建议使用frozenset。