在python中创建一个集合的元组总是会产生相同的元组

时间:2018-05-27 09:43:58

标签: python set tuples

在我的代码中,我将一个集转换为元组,以便将其用作字典键。由于集合没有订单和元组,所以看起来似乎是:

tuple(some_set)

每次都不保证相同的元组,因为必须创建一个订单。但是,通过在实践中测试它,似乎每次都将给定的集转换为相同的元组,如下面的代码打印1所示。

my_tuples = set()

for i in range(100000000):
    my_tuples.add(tuple(set(range(100))))


print(len(my_tuples))

我找不到任何关于此的文档,但是tuple()函数是否总是在给定集合上返回相同的元组?这是明确说明的吗?

2 个答案:

答案 0 :(得分:3)

集合不是“随机”排序的,它们是根据可能发生变化的内部逻辑排序的(例如,在不同的Python版本中)。在开发过程中应忽略此内部逻辑,您应该将集合视为没有任何顺序。

实际上,

set([-1,-2]) == set([-2,-1]) # is True

tuple(set([-1,-2])) == tuple(set([-2,-1])) # is False

如果你看看两个元组是什么,你会发现tuple(set([-1,-2])), tuple(set([-2,-1]))((-1, -2), (-2, -1))

因此,集合中元素的插入顺序会影响它们随后如何迭代,并且由于tuple()基于集合的迭代器,结果就是您在上面看到的结果。

最后,如果您不打算更改“上下文”(例如python版本)并且集合的创建始终在相同的情况下发生,您可以安全地假设元素的顺序将是相同的(<但是,请注意,在编写明天会丢弃的内容时,这可能是可以接受的,但不是其他任何地方。

答案 1 :(得分:0)

整数哈希自己:

example=[5,0,1,2,3,4]
print(set(example))

输出:

{0, 1, 2, 3, 4, 5}

提出不按排序顺序排列的整数集的例子并不难。

example=[-5,0,1,2,3,4]
print(set(example))

输出:

{0, 1, 2, 3, 4, -5}