set intersection 是否保证一组整数被排序?

Does set intersection guarantee a set of integers to be sorted?

我正在尝试对整数进行大量简单的 "intersection" 运算。不幸的是,我的设置中没有可用的 numpy/scipy,我无法更改它。

我在 Whosebug 上注意到 Python 设置 operation nicely sorts the data,这不仅加快了案例加载速度,而且就我而言,我实际上也想对数据进行排序,因此这将是一个很棒的奖金。

我现在就是怕不是一直有效,所以我去测试了:

import random 

one = range(100)
two = range(50)
three = range(50)

for i in xrange(1000000):
    # shuffle the lists
    random.shuffle(one)
    random.shuffle(two)    

    # do set operation  
    res = [v for v in set(one) & set(two)]
    if res != three:
        print res

结果是所有的样本都排序好了(没有打印错的情况)。

虽然这很有说服力,但我想知道在使用集合交集时是否会出现整数未完全排序的情况?

一套没有顺序,所以任何顺序都是偶然的。或者,准确地说,它确实有一些顺序,但你不能对它做出任何假设。如果您希望对结果进行排序,您需要自己使用 sorted().

对其进行排序

不,不是。

CPython 的集合交集实现以散列顺序对两个集合进行并行迭代。进一步测试匹配的哈希值是否相等。

如果你有一组小的连续 ints,它们都会自己散列,所以一切都会很好。但如果集合是其他任何东西(宽间隔的整数、字符串等),则不会出现同样的效果。

如果你知道去哪里找,反例很容易找到

>>> [v for v in set(range(-10,0)) & set(range(-5,10))]
[-2, -5, -4, -3, -1]