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]
→ Ссылка
Автор решения: Xander

Вот этот код не только различает 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
→ Ссылка