【发布时间】: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} 其中a、b 和c 是对象实例。这个唯一的值对于一个组,所以我可以告诉a和c在第1组,b在第2组。实际数字无关紧要,它只是组的唯一键,不与此结构之外的任何事物无关。实际结构是一个包含两个字段的数据库表,这两个字段都被索引,以便我可以快速找出,例如,与a 在同一组中的还有什么。
现在我需要唯一编号,即当我想添加一个组时。这不会经常发生,因此它不必非常高效,但由于数据量可能会变得非常大,我需要减少迭代次数。我意识到有一些简单的方法可以在可接受的限制下做到这一点,例如使用大范围的randint(例如 1e6),甚至可能使用数据库函数。但是由于我一直在考虑这个问题,因此找到一个巧妙的解决方案来填充没有硬编码限制的值已经成为一个有趣的问题。显然内存限制(例如整数的最大大小)仍然适用。
【问题讨论】:
-
那么这个单个整数是否必须在集合的最大和最小数之间?
-
为了提高效率,您可以编写一个小函数来计算您的集合的最小值、最大值和计数。然后在数学上确定是否有任何差距。如果有差距,您可以检查从 min 开始的每个数字,如果没有差距,您可以选择 max+1 或 min-1。
-
@jamylak:不,它可以是任何数字。我基本上是在尝试生成要在字典中使用的键。
-
我在你对数据库的描述和你需要在 python 中编写代码之间的更新中迷失了。当然,最简单的做法是让第二个字段成为“组”表的外键。任何时候你需要一个新的组,你创建一个组表的单调递增的 row_id 将处理需要的数字。
-
组表中的所有内容都是一个键。但就像我说的,我很想知道如何在 python 中解决这个问题。
标签: python random python-3.x integer