如何在不使用内置函数或模块的情况下从列表中查找最小的缺失数字

时间:2015-08-18 06:24:27

标签: python list

这是我的清单:

List = [[1,2,4,5], [1,2,3,4,5,7], [1,4,5,6], [2,3,5], [1,2,3]]

从这个如何找到所有最小的缺失数字?

修改

  • "最小的缺失数字"是第一个不在列表中的整数(> 0)。
  • 示例输入的预期输出为3,6,2,1和4.
  • 输入列表始终已排序。

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]

当然,这种方法使用内置函数。但是你可以从这里开始,通过你自己的实现替换禁用的函数来分解它。