Python принимает значение False за 0
def move_zeros(array):
array_list = array
if 0 in array_list:
for _ in range(0, len(array_list)):
array_list.remove(0)
array_list.append(0)
return array_list
Код принимает список любых значений и удаляет нули и возвращает их в конец этого списка, но когда в список попадает False, то он его удаляет так же как и ноль. Что можно сделать чтобы этого избежать?
Ответы (2 шт):
Boolean тип наследуется от типа int, поэтому значение False равно 0. Это означает, что вы можете отличить 0 от False с помощью проверки типа. False это bool, а 0 - int.
Кроме того, remove удаляет первое вхождение, поэтому даже с этой проверкой код не работал. ;). Давайте просто использовать del
Вот такой код решает проблему:
def move_zeros(array):
for i in range(len(array)):
if array[i] == 0 and not isinstance(array[i], bool):
del array[i]
array.append(0)
return array
inp = [0, 1, 0, None, 0, 2, False, "", [], (), 1, 0]
print(inp)
print(move_zeros(inp))
print(inp)
Вывод:
[0, 1, 0, None, 0, 2, False, '', [], (), 1, 0]
[1, None, 2, False, '', [], (), 1, 0, 0, 0, 0]
[1, None, 2, False, '', [], (), 1, 0, 0, 0, 0]
Эта функция влияет на существующий массив, и возвращает его
Если вы хотите, чтобы эта функция не влияла на массив, а создавала новый, то вы можете попробовать вот это:
def move_zeros(array):
array = array[:]
for i in range(len(array)):
if array[i] == 0 and not isinstance(array[i], bool):
del array[i]
array.append(0)
return array
inp = [0, 1, 0, None, 0, 2, False, "", [], (), 1, 0]
print(inp)
print(move_zeros(inp))
print(inp)
Вывод:
[0, 1, 0, None, 0, 2, False, '', [], (), 1, 0]
[1, None, 2, False, '', [], (), 1, 0, 0, 0, 0]
[0, 1, 0, None, 0, 2, False, '', [], (), 1, 0]
Вот этот код не только различает 0 и False, но ещё и работает за линейное время, а не за квадрат, как ваш.
def move_zeros(data):
num = len(data)
data = [x for x in data if not(x == 0 and not isinstance(x, bool))]
data.extend([0] * (num - len(data)))
return data