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 的集合交集实现以散列顺序对两个集合进行并行迭代。进一步测试匹配的哈希值是否相等。
如果你有一组小的连续 int
s,它们都会自己散列,所以一切都会很好。但如果集合是其他任何东西(宽间隔的整数、字符串等),则不会出现同样的效果。
如果你知道去哪里找,反例很容易找到
>>> [v for v in set(range(-10,0)) & set(range(-5,10))]
[-2, -5, -4, -3, -1]
我正在尝试对整数进行大量简单的 "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 的集合交集实现以散列顺序对两个集合进行并行迭代。进一步测试匹配的哈希值是否相等。
如果你有一组小的连续 int
s,它们都会自己散列,所以一切都会很好。但如果集合是其他任何东西(宽间隔的整数、字符串等),则不会出现同样的效果。
如果你知道去哪里找,反例很容易找到
>>> [v for v in set(range(-10,0)) & set(range(-5,10))]
[-2, -5, -4, -3, -1]