设置交集保证一组整数是否排序?

时间:2015-01-19 23:28:59

标签: python python-2.7 set set-intersection

我正在尝试用整数进行大量简单的“交叉”操作。不幸的是,我在设置中没有numpy / scipy,我无法改变它。

我在stackoverflow上注意到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

结果是所有样本都被排序(没有打印错误的案例)。

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

3 个答案:

答案 0 :(得分:3)

不,不是。

CPython的集合交集实现通过两个集合的并行迭代工作,按哈希顺序。匹配哈希进一步测试是否相等。

如果你有一组小的连续int,他们都会自己哈希,所以一切都会好起来的。但如果这些集合是其他任何东西(宽间距的整数,字符串,无论如何),同样的效果也不会出现。

答案 1 :(得分:2)

套装没有订单,因此任何订购都是偶然的。或者,确切地说,它确实有一些排序,但您无法对其做出任何假设。如果您希望对结果进行排序,则需要使用sorted()自行对其进行排序。

答案 2 :(得分:1)

如果你知道在哪里看

,很容易找到反例
>>> [v for v in set(range(-10,0)) & set(range(-5,10))]
[-2, -5, -4, -3, -1]