如何忽略False,因此不算为0

时间:2019-09-05 08:55:54

标签: python

有没有一种方法可以使0与False不相同?     因为我一直得到错误的结果,却找不到解决方案     

def move_zeros(array):    
    a = 0
    for i in array:
        if array[a] == 0:
            array.remove(array[a])
            array.append(0)
            a +=1
        else:
            a += 1         
    return array    

print(move_zeros([0,1,None,2,False,1,0]))

输入数组:

[0,1,None,2,False,1,0]

预期输出:

[1,None,2,False,1,0,0]

实际输出:

[1, None, 2, 1, 0, 0, 0]

4 个答案:

答案 0 :(得分:3)

布尔类型继承自int类型,因此False为0,但类型不同。这意味着您可以通过类型检查将0与False区分。 False和bool,因此是int,但0并非布尔值。

此外,.remove删除等于该值的第一个值,因此即使进行此检查,代码也无法正常工作。 ;)不管a的值是多少,都取前0,所以它也取False。我们只使用del

def move_zeros(array):    
    a = 0
    for i in array:
        if array[a] == 0 and not isinstance(array[a], bool):
            del array[a]
            array.append(0)
            # a +=1 if you remove an element, next one jumps in its place, so you have to check the same index
        else:
            a += 1         
    return array    

print(move_zeros([0,1,None,2,False,1,0]))

输出:

[1, None, 2, False, 1, 0, 0]

答案 1 :(得分:3)

在更新列表时迭代列表通常会导致问题,因此应避免使用它。

只需在列表理解中构建一个非零值列表,然后附加所需的零即可:

def move_zeros(array):
    out = [v for v in array if v != 0 or v is False]
    out.extend([0] * (len(array) - len(out)))
    return out

请注意,0False相等,因此0 == False,但是它们是不同的对象,因此0 is not False

使用您的数据进行测试:

print(move_zeros([0,1,None,2,False,1,0]))
# [1, None, 2, False, 1, 0, 0]

另一个测试用例将会失败,并且在更新列表时会在列表上迭代一些解决方案:

move_zeros([0,1,None, 0, 0, 2,False,1,0])
# [1, None, 2, False, 1, 0, 0, 0, 0] 

答案 2 :(得分:1)

您可以使用附加子句is not False来区分0和False。

def move_zeros(array):    
    zeroLocations = [i for i in range(len(array)) if array[i] == 0 and array[i] is not False]   
    zeroLocations.reverse() 
    for zeroId in zeroLocations:
        del array[zeroId] 
        array.append(0) 
    return array  

答案 3 :(得分:0)

您可以检查要使用的元素的类型,因此只有当元素不是布尔值且等于0时,该元素的类型才会被删除,并将0附加到列表中。

def move_zeros(input):
    for index, element in enumerate(input):
        if element == 0 and not isinstance(element, bool):
            input.pop(index)
            input.append(0)

    return input

print(move_zeros([0,1,None,2,False,1,0]))