我在 python 中有一个这样的列表:
myList = [1,14,2,5,3,7,8,12]
如何轻松找到第一个未使用的值? (在本例中为“4”)
原文由 jul 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在 python 中有一个这样的列表:
myList = [1,14,2,5,3,7,8,12]
如何轻松找到第一个未使用的值? (在本例中为“4”)
原文由 jul 发布,翻译遵循 CC BY-SA 4.0 许可协议
这利用了集合的属性
>>> l = [1,2,3,5,7,8,12,14]
>>> m = range(1,len(l))
>>> min(set(m)-set(l))
4
原文由 Bhargav Rao 发布,翻译遵循 CC BY-SA 3.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
我想出了几种不同的方法:
迭代第一个不在集合中的数字
我不想获得最短的代码(这可能是设置差异的诡计),而是一些可以有良好运行时间的代码。
这可能是这里最好的建议之一,我的测试表明它可能比集合差异方法快得多 - 特别是如果洞在开始时 - :
该数组变成了
set
,其__contains__(x)
方法对应于x in A
。count(1)
创建一个从 1 开始计数到无穷大的计数器。现在,filterfalse
消耗计数器中的数字,直到找到不在集合中的数字;当找到第一个不在集合中的数字时,它由next()
产生时间
len(a) = 100000
,随机和抢手的数字是8
:时间为
len(a) = 100000
,订购和第一个免费的是100001
(请注意,这是 Python 3 和
range
是 py2xrange
)使用heapq
渐近的好答案:
heapq
与enumerate
现在,如果用 C 编写,上面的解决方案可能是首选解决方案,但是
heapq
是用 Python 编写的,很可能比许多其他主要使用 C 代码的替代方案慢。只需排序和枚举即可找到第一个不匹配的
或具有 O(n lg n) 良好常数的简单答案
如果 由于 Python Timsort 的工作方式,列表几乎已排序,这可能是最快的,但对于随机化,集合差异和迭代第一个不在集合中的速度更快。
+ [ None ]
对于没有间隙的边缘情况是必需的(例如[1,2,3]
)。