【问题标题】:Does set intersection guarantee a set of integers to be sorted?集合交集是否保证对一组整数进行排序?
【发布时间】:2015-01-19 23:28:58
【问题描述】:

我正在尝试对整数进行大量简单的“交集”操作。不幸的是,我的设置中没有可用的 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

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

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

【问题讨论】:

    标签: python python-2.7 set set-intersection


    【解决方案1】:

    不,不是。

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

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

    【讨论】:

    • 这真是太好了。不过,我仍然想知道边界。到目前为止,模拟了许多可能的情况(例如set(range(100)) & set([41,42,43,44])) 确实有效。
    • 确实,数字不跟随自己的情况,这就是问题所在(例如set(range(100)) & set([41,42,43,46]))。
    • @PascalvKooten 是否有效取决于哈希模数是否丢失信息。基本上,如果数字足够稀疏以至于桶的数量小于最大整数,那么事情就会中断。
    【解决方案2】:

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

    【讨论】:

    • 我的假设是,在 100 万个随机案例中的 100 万个中,该集合确实是排序的(我会再次提及:它是 Python 集合的设计)。我只是想知道我是否可以安全地使用它;基本上我正在寻找一个无法工作的可重现示例。
    • @PascalvKooten:集合中的排序不是随机的,这并不意味着它会被排序百万分之一。是否会得到排序结果取决于散列函数。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 2017-04-26
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多