0

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

我在 stackoverflow 上注意到 Python 集合操作很好地对数据进行了排序,这不仅加快了案例的加载速度,而且在我的情况下,我实际上也想对数据进行排序,因此这将是一个很棒的奖励。

我现在只是害怕它并不总是有效,所以我去测试:

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

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

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

4

3 回答 3

3

不,这不对。

CPython 的集合交集实现通过在两个集合上以散列顺序并行迭代来工作。匹配的哈希值会被进一步测试是否相等。

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

于 2015-01-19T23:38:12.987 回答
2

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

于 2015-01-19T23:33:28.430 回答
1

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

>>> [v for v in set(range(-10,0)) & set(range(-5,10))]
[-2, -5, -4, -3, -1]
于 2015-01-19T23:43:33.870 回答