不应将False视为0

Tro*_*ors 3 python python-3.x

我必须遍历包含随机值的列表

["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]
Run Code Online (Sandbox Code Playgroud)

并将所有零(0)移动到列表的末尾,保留其他元素的顺序.这是我的代码:

for i in range(len(array)):
        if array[i] ==0 and array[i] is not False:
            array.append(array[i])
            array.remove(array[i])

  return array
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但它将'False'视为0,因此输出与所需的输出不匹配.我已经尝试搜索答案并将其实现到我的代码中,例如使用'is'和'is not',但它们似乎并不适合我.我还可以做些什么?

我的输出:['a', 'b', None, 'c', 'd', 1, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]但输出应该是['a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Ror*_*ton 5

有很多方法可以将零移动到数组的末尾.这是迭代列表(根据需要)并避免任何高级Python功能的一种方法.请注意,这使用临时数组,因为在迭代它时重新排序列表中的项目是一个非常糟糕的主意.

array = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]

newarray = []
for item in array:
    if item != 0 or item is False:
        newarray.append(item)
while len(newarray) < len(array):
    newarray.append(0)
array = newarray

print(array)
Run Code Online (Sandbox Code Playgroud)

这给出了打印输出

['a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

如果你想理解为什么Python对待False0,你应该理解它False并且Truebool类型的成员,它是一个子类型int.换句话说,False真的0只是一种特殊的类型.这通常是个好主意,但你发现了一个让事情变得更复杂的案例.