在集合中使用pop方法删除项目总是删除相同的项目


x = [1, 2, 3, 3, 4, 4]
y = set(x)
print(y)
y.pop()
y.pop()
print(y)

这是我的示例代码。在我读到的文档中,集合总是丢弃随机项目,但我的代码总是返回以下内容:

{1, 2, 3, 4}
{3, 4}

我是不是做错了什么,或者为什么前两项总是掉下来?如果我想删除最后一个元素,是否需要将集合转换为列表,然后再转换回集合?

发生这种情况是因为pop总是来自同一个set。集合没有顺序,它是实现的细节,它的项在内存中的具体布局。通常,为每个项目计算一个散列函数,该函数表示哪个元素优先。因此,它不是"随机"的,因为每次运行都会得到不同的元素,它是"随机的",因为在"任意"的意义上,你不能依赖于明显的顺序。

并且,顺便说一句,在CPython 3.7中,dict现在是有序的(但不是set(。

当文档说它是"随机的"时,这意味着不应该期望从中得到任何东西,除非它会删除一个元素。这并不一定意味着它是一致随机的。(从技术上讲,它是随机的,只是不是一致随机的,这是人们在想到随机性时想到的(

如果你想均匀随机地丢弃元素,那么也许你应该考虑使用一个列表,并对其调用shuffle,然后弹出元素。

random.shuffle(lst)
while lst:
print(lst.pop())

最新更新