有没有一种方法可以使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]
答案 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
请注意,0
和False
相等,因此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]))