Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一系列数字行中查找缺少的元素_Python_Python 2.7 - Fatal编程技术网

Python 在一系列数字行中查找缺少的元素

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

假设我有一个范围列表,即[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 < 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毫秒内就出来了,就在我按下回车键之后。。。