假设我有一个范围列表(即[[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]]
答案 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]