Python Pop从集合的开始处获取一个连续枚举的范围的值。这是有意的吗?

Python Pop从集合的开始处获取一个连续枚举的范围的值。这是有意的吗?,python,list,set,Python,List,Set,如果以前有人问过这个问题,我很抱歉,但我无法弄清楚这个主筛是如何在集合上使用pop可靠地提取其第一个/最低值的 def get_primes(n): numbers = set(range(n, 1, -1)) primes = [] while numbers: p = numbers.pop() primes.append(p) numbers.difference_update(set(range(p*2, n+1,

如果以前有人问过这个问题,我很抱歉,但我无法弄清楚这个主筛是如何在集合上使用pop可靠地提取其第一个/最低值的

def get_primes(n):
    numbers = set(range(n, 1, -1))
    primes = []
    while numbers:
        p = numbers.pop()
        primes.append(p)
        numbers.difference_update(set(range(p*2, n+1, p)))
    print(primes)
get_primes(input('Primes under:'))
据我所知,它似乎是准确的,这似乎意味着它总是从集合中弹出最小(或最左边)的数字,
数字
,这与我对集合如何工作的理解(天生无序)相矛盾。当尝试对多个枚举的范围使用相同的方法时,我得到了不太可预测的结果(正如最初预期的那样)

我自己做了一些测试:

numbers = set(range(15, 1, -1))
p = numbers.pop()
P>: 2
---------------------------------------------------------
numbers = set(range(15, 1, -2))
p = numbers.pop()
P>: 3
---------------------------------------------------------
numbers = set(range(15, 1, -3))
p = numbers.pop()
P>: 9
---------------------------------------------------------
numbers = set(range(15, 4, -1))
p = numbers.pop()
p>: 5
---------------------------------------------------------
numbers = set(range(15, 4, -2))
p = numbers.pop()
p>: 5
---------------------------------------------------------
numbers = set(range(15, 4, -3))
p = numbers.pop()
p>: 9
上面的函数如何不只是提取复合数并将其附加到素数列表中?即使它所从的集合不再由一个枚举,它似乎仍然有效,不仅如此,而且返回的素数列表看起来完全按照一万(甚至更高)的数量级排序。有没有可能对像我测试过的任何一组重复这样的操作

提前谢谢


编辑:在跟踪问题“重复链接”中发布的一些链接后,我发现集合是基于最后三个二进制数字的值排序的。

集合是通过哈希索引的,因此对于整数,它们将按升序排序,因为如果n是介于0和2^31-1之间的正整数,则哈希(n)=n。但是,我不相信这一点,因为int的大小在不同的系统中可能会有所不同,而且它实际上不是集合中支持的功能。

请您修复缩进,好吗?相关的,可能是dup:我不确定
>1
递增范围位,但这里有一个现有的答案,重点是为什么整数不是随机的:@EricDuminil:那是因为OP没有创建不相交的序列。@EricDuminil:另外,请查看结果集,而不仅仅是弹出的内容
set(范围(15,4,-3))
{9,12,6,15}
,因此弹出
9
。只有小的
int
散列themselves@Chris_Rands:“小”是相对的<代码>哈希(10**18)=10**18在我的系统上。你不想在10**18中使用这个算法。@EricDuminil这很公平,也许不是那么小…@Chris\u Rands:不,除了-1散列以外的整数一直到
(sys.maxsize//4)-1
(因为长整数的实现方式)。@Chris\u Rands:因为
-1
是C代码中的错误条件。您不能从哈希函数返回
-1
,因为这意味着存在异常。。