如果条件错误

时间:2016-03-10 00:02:59

标签: python

def next_id(arr):
    if arr:
        arr.sort()
        if arr[0] != 0:
            return 0
        for i in range(len(arr)):
            if (arr[i]-arr[i+1])<-1:
                return arr[i]+1
            else:
                return arr[len(arr)-1]+1
    else:
        return 0

我正在尝试找到最小的未使用的ID,并且由于某种原因,它不会进入此if条件:

if (arr[i]-arr[i+1])<-1:

当我尝试这个时

next_id([0,1,2,3,5]

对于测试,它返回6而不是4。

5 个答案:

答案 0 :(得分:3)

问题是你的函数总是for的第一个循环中退出:对于数组-1的第一次迭代,差异为[0, 1, 2, 4, 5];并运行else分支;并且它会立即返回最大的id + 1。

因此,在循环完成后,此代码应仅在中执行:

def next_id(arr):
    if not arr:
        return 0

    arr.sort()
    if arr[0] != 0:
        return 0

    for i in range(len(arr) - 1):
        if arr[i] - arr[i + 1] < -1:
            return arr[i] + 1

    return arr[-1] + 1

请注意,结束索引也需要调整 - 而不是迭代到len(arr),我们只能迭代到len(arr) - 1,否则arr[i + 1]将超出范围。

如果你想更简洁地写,那么相同的算法可以写成

def next_id(arr):
    return next(i for i, j in enumerate(sorted(arr) + [None]) if i != j)

答案 1 :(得分:2)

这是怎么回事?

def next_id(arr):
    arr = sorted(set(arr))
    # arr = sorted([x for x in set(arr) if type(x) is int]) # If you want a more tolerance
    if arr[0] != 0:
        return 0
    for i, v in enumerate(arr):
        if i != v:
            return i
    return i+1

它只是迭代每个位置并返回索引,如果它不匹配。我在重复的情况下添加了set()。

arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 5 # => UH OH! Return 4

所以:

print(next_id([0,1,2,3,5])) # => 4
print(next_id([0,1,2,3,4,5])) # => 6
print(next_id([7,1,3,7,1,4,2,3,4,7,0,9,9,2,3,7,0,9,6,5])) # => 8

答案 2 :(得分:0)

for循环中,您拥有以下结构:

for ...:
    if ...:
        return ...
    else ...:
        return ...

这意味着for循环保证在第一次迭代时返回。尝试这样的结构:

for ...:
    if ...:
        return ...
return ...

如果满足if,则此结构将首先返回,如果永远不满足if,则将进行第二次返回。

答案 3 :(得分:0)

试试这个:

def next_id(arr):
if arr:
    arr.sort()
    if arr[0] != 0:
        return 0
    for i in range(len(arr)):
        if (arr[i]-arr[i+1])<-1:
            return arr[i]+1
    return arr[len(arr)-1]+1
else:
    return 0

打印(NEXT_ID([0,1,2,3,5]))

答案 4 :(得分:0)

有趣,我只是在 codewars 上做简单的 kata,在寻找如何解决问题的同时,我发现了这篇文章。我设法解决了它,这就是我使用的代码:

def next_id(arr):
for i in range(len(arr)+1):
    if i not in arr:
        return I

希望有所帮助。 range(len(arr)+1) required as If you would have a list [1,2,3] 下一个可用的是 [4](不在列表中),因此您需要使列表更长一些,以防万一。