这是我的清单:
List = [[1,2,4,5], [1,2,3,4,5,7], [1,4,5,6], [2,3,5], [1,2,3]]
从这个如何找到所有最小的缺失数字?
修改
答案 0 :(得分:2)
没有任何内置函数的方法:
Lists = [[1,2,4,5],[1,2,3,4,5,7],[1,4,5,6]]
for List in Lists:
i = 1
while i <= List[-1] + 1:
if i in List:
i += 1
else:
break
print i
基本上它会分别处理每个List
(这就是你想要的吗?)。它会从i
开始迭代计数器1
(假设您查找整数&gt; 0)并在List
不包含i
时停止。
输出:
3
6
2
答案 1 :(得分:1)
如果子列表已经按照您的输入进行排序,只需将前一个元素与当前元素进行比较,如果prev +1不等于当前元素将prev + 1添加到输出列表:
List = [[1, 2, 4, 5], [1, 2, 3, 4, 5, 7], [1, 4, 5, 6]]
out = []
for sub in List:
prev = sub[0]
for ele in sub[1:]:
if prev + 1 != ele:
out.append(prev +1)
break
prev = ele
print(out)
[3, 6, 2]
它适用于任何订购的子列表,而不仅仅是以1:
开头的列表List = [[3, 4, 5,7], [10,13,14,15], [100,101,104,105]]
输出:
[6, 11, 102]
没有切片:
out = []
for sub in List:
prev = sub[0]
i = 0
for ele in sub:
if i == 0:
i += 1
continue
if prev + 1 != ele:
out.append(prev +1)
break
prev = ele
print(out)
如果您总是希望找到从1
开始的第一个缺失号码,并且可以包含0或负数,则只检查每个号码,如果ele是&gt;则只增加i
。 0:
out = []
for sub in Lists:
i = 1
for ele in sub:
if ele > 0:
if ele != i:
out.append(i)
break
i += 1
print(out)
这意味着在最糟糕的情况下,您使用O(n^2)
答案 2 :(得分:0)
灵感来自this answer:
List = [[1,2,4,5],[1,2,3,4,5,7],[1,4,5,6]]
print [sorted(set(range(1,max(l)+2)).difference(l))[0] for l in List]
输出:
[3, 6, 2]
当然,这种方法使用内置函数。但是你可以从这里开始,通过你自己的实现替换禁用的函数来分解它。