【问题标题】:Find a number not in a set查找不在集合中的数字
【发布时间】:2012-04-19 00:21:26
【问题描述】:

我正在尝试找到一种合理有效的方法来获取不在集合中的任何单个整数。例如,如果我有numbers={1, 4, 9},那么有效结果将是3。我可以这样做:

n = random.randint(-100, 100)
if n not in numbers:
    return n

但我不想被限制在任意范围内(例如 -100 -> 100),因为我不知道该集合有多大。另一种选择是遍历每个整数,但这会非常低效。

有人对更好的方法有什么建议吗?

编辑:由于关于我正在尝试做什么的问题很多,我正在更新这个问题以解释一些背景。

我实际上想要实现的是这样的映射:{a: 1, b: 2, c: 1} 其中abc 是对象实例。这个唯一的值对于一个组,所以我可以告诉ac在第1组,b在第2组。实际数字无关紧要,它只是组的唯一键,不与此结构之外的任何事物无关。实际结构是一个包含两个字段的数据库表,这两个字段都被索引,以便我可以快速找出,例如,与a 在同一组中的还有什么。

现在我需要唯一编号,即当我想添加一个组时。这不会经常发生,因此它不必非常高效,但由于数据量可能会变得非常大,我需要减少迭代次数。我意识到有一些简单的方法可以在可接受的限制下做到这一点,例如使用大范围的randint(例如 1e6),甚至可能使用数据库函数。但是由于我一直在考虑这个问题,因此找到一个巧妙的解决方案来填充没有硬编码限制的值已经成为一个有趣的问题。显然内存限制(例如整数的最大大小)仍然适用。

【问题讨论】:

  • 那么这个单个整数是否必须在集合的最大和最小数之间?
  • 为了提高效率,您可以编写一个小函数来计算您的集合的最小值、最大值和计数。然后在数学上确定是否有任何差距。如果有差距,您可以检查从 min 开始的每个数字,如果没有差距,您可以选择 max+1 或 min-1。
  • @jamylak:不,它可以是任何数字。我基本上是在尝试生成要在字典中使用的键。
  • 我在你对数据库的描述和你需要在 python 中编写代码之间的更新中迷失了。当然,最简单的做法是让第二个字段成为“组”表的外键。任何时候你需要一个新的组,你创建一个组表的单调递增的 row_id 将处理需要的数字。
  • 组表中的所有内容都是一个键。但就像我说的,我很想知道如何在 python 中解决这个问题。

标签: python random python-3.x integer


【解决方案1】:

max(numbers)+1 呢??

【讨论】:

  • @vaisakh:通常我不会将部署内置函数描述为 creative。整洁,是的。优雅,也许。创意,没那么多。
  • 这需要迭代整个集合——我们绝对不需要这个。
  • @MattH:是的,但我指的是这个想法。我认为这是开箱即用的想法。 :) 快速(如快速思考)但可能很脏?
  • @vaisakh:这是分配 ID 的一种非常常见的模式。更常见的是跟踪最大值,因此您不必调用 max()。
  • @LennartRegebro 当然,我知道身份证。可能是因为对于这个问题,乍一看这似乎很简单(尽管效率低下),以至于我就像..“我怎么能错过它?” :D
【解决方案2】:
def numnotinset(myset):
  i = min(myset)
  while True:
    i += 1
    if not i in myset:
      return i  

【讨论】:

    【解决方案3】:

    任何不在集合中的单个整数

    但是整数值的数量是无限的,所以整数值的数量是无限的,而不是在有限集合中。除非您说的是有限范围内的整数(例如 16 位)。

    最有效的解决方案将取决于整数集的完整性 - 如果它是稀疏的,那么随机选择一个数字可能会更频繁地返回一个不在集合中的数字。如果差距很少,那么优化的搜索将更有效。这两者都依赖于集合的排序列表。

    查看搜索方法,可以通过对数据进行分区来加快搜索速度:计算列表中数字的最低和最高索引的均值 M,如果 dataset[M]

    【讨论】:

      【解决方案4】:

      不完全确定您需要什么

      >>> numbers = {1, 4, 9}
      >>> from itertools import count
      >>> next(x for x in count() if x not in numbers)
      0
      

      【讨论】:

        【解决方案5】:

        不,它可以是任何数字。我基本上是在尝试生成要在字典中使用的键。

        听起来像XY Problem

        你为什么要用随机数键入字典?你甚至应该使用字典吗?

        如果你需要一个数字索引,对于字典,最简单的方法是记录最后一个给出的键,然后当你需要另一个时,增加这个数字并使用它。

        您忽略了因删除和/或偶尔重新编号而导致索引丢失的问题。

        【讨论】:

        • 不完全是......我的意思似乎有点混乱,所以我会更新我的问题以澄清一下。
        猜你喜欢
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 2019-11-30
        相关资源
        最近更新 更多