Python 如何忽略False,使其不';不算作0

Python 如何忽略False,使其不';不算作0,python,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

有没有办法使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]
预期输出:

[0,1,None,2,False,1,0]
[1,None,2,False,1,0,0]
实际输出:

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

您可以检查使用的元素的类型,因此只有当元素不是bool且等于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]))

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

另外,
.remove
会删除与该值相等的第一个值,因此即使使用此检查,代码也不会起作用它取第一个0,不管
a
的值是多少,所以它也取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]

在更新列表时对其进行迭代通常会导致问题,因此您应该避免它

只需在列表中构建一个非零值列表,并附加所需的零:

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
请注意,
0
False
是相等的,因此
0==False
,但它们是不同的对象,因此
0不是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] 

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

def移动零点(数组):
如果数组[i]==0且数组[i]不为False,则zeroLocations=[i代表范围内的i(len(数组))]
zerocations.reverse()
对于零位置中的零ID:
del数组[zeroId]
array.append(0)
返回数组

<>代码>为什么不尝试用字符串“f”或“false”替换false,这将防止Python作为0@h4z3删除元素是否不好?我想知道为什么。@psn1997我正在进行代码战培训,用“F”替换它也会输出错误的结果。如果你愿意,我可以粘贴这个问题。在数据类型上添加一个条件:
如果isinstance(array[a],int)和array[a]==0
@shaikmoeed right,应该使用not bool实例,而不是InteExcellent point实例来描述在提供的其他解决方案(包括mines)中失败的测试用例Thierry提供了一个更完整的示例,并在我的答案中显示了缺陷,但我将把它留在这里,以完整性来突出缺陷。