Python 在一系列数字行中查找缺少的元素
假设我有一个范围列表,即[1100][102200]等]。我想找出总范围内缺失元素的数量。我有一个工作算法如下:Python 在一系列数字行中查找缺少的元素,python,python-2.7,Python,Python 2.7,假设我有一个范围列表,即[1100][102200]等]。我想找出总范围内缺失元素的数量。我有一个工作算法如下: def missing(numranges): (minimum, maximum) = (min(map(lambda x: x[0], numranges)), max(map(lambda x: x[1], numranges))) (count, i) = (0, minimum) while i
def missing(numranges):
(minimum, maximum) = (min(map(lambda x: x[0], numranges)),
max(map(lambda x: x[1], numranges)))
(count, i) = (0, minimum)
while i < maximum:
if any(j <= i <= k for j, k in numranges):
count += 1
i += 1
return maximum - minimum - count
问题是,如果你说一个数字行是[[1,10000],[10002,20000]],那么我会检查所有20000个元素,在我看来这是非常低效的。我正试图找到一种使算法更好的方法,但我有点不知所措
编辑:对不起,应该提到数字范围可能重叠,即[1,10000],[1,100001],[100003,100005]等]根据您的示例,我假设您的列表是按递增顺序排列的,并且您的范围不会重叠
>>> l = [[1, 50] ,[55, 90], [95, 100]]
>>> sum([l[i+1][0]-m[1]-1 for i, m in enumerate(l[:-1])])
8
逻辑:我用上一个子列表的索引1减去子列表的索引0。这是实现你想要的最优化的方式。你可以这样做
In [22]: input_list = [range(1,100),range(102, 200)]
In [23]: total_list = sum(input_list,[])
In [24]: master_total_list = range(min(total_list),max(total_list)+1)
In [25]: [i for i in master_total_list if i not in total_list]
Out[25]: [100, 101]
请尝试解决此问题:
test = set(range(1, 100 + 1) + range(102, 200 + 1))
missing = list(set(range(min(test), max(test))) - test)
print (missing)
请参阅此代码
l=[[1, 50], [55, 90], [95, 100]]
res=[]
for item in l :
res.extend(range(item[0],item[1]))
print [k for k in range(max(res)) if k not in res]
输出:
[0, 50, 51, 52, 53, 54, 90, 91, 92, 93, 94]
如果你的代码正在运行,你只是想帮助改进它,那么我建议你把它发布在@Harrison上。很抱歉,以后会这样做。这里缺少8个数字,而不是10:51、52、53、54、91、92、93和94。您正在创建一组所有数字,并将其与列表中的范围相减,您称之为优化?真的?真的!这是一段非常简单易懂的代码,优化之处在于它需要几秒钟的时间来编写。除非你想检查一百万个数字的范围,否则这太快了,不值得优化。但你说得有道理,那就是。。。只是为了好玩,我尝试了一百万个数字。结果在100毫秒内就出来了,就在我按下回车键之后。。。