在一系列数字行中查找缺失元素

时间:2016-08-25 12:43:01

标签: python python-2.7

假设我有一个范围列表(即[[1,100][102, 200], etc]]。我想找到总范围内缺失元素的数量。我有一个工作算法如下:

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]],那么我会查看所有20,000个元素,而且在我看来这是非常低效的。我试图找到一种方法来使算法更好,但我有点难过。

编辑:对不起,应该提到数字范围可能重叠(即。[1, 10000], [1, 100001], [100003, 100005], etc]]

4 个答案:

答案 0 :(得分:0)

这里我假设您的示例基于您的列表递增顺序且您的范围不会重叠

>>> 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。它是实现您想要的最佳方式。

答案 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]

答案 2 :(得分:0)

尝试设置来解决这个问题:

test = set(range(1, 100 + 1) + range(102, 200 + 1))
missing = list(set(range(min(test), max(test))) - test)
print (missing)

答案 3 :(得分:0)

请参阅此代码

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]