Почему этот код удаляет False из массива? - PullRequest
0 голосов
/ 19 июня 2020

Это задача:

Написать алгоритм, который берет массив и перемещает все нули в конец, сохраняя порядок других элементов

Что не так с этим кодом? Почему он не сохраняет логические значения при итерации по списку и удалении нулей? Это потому, что False равно 0?

move_zeros([False,1,2,0,1,0,1,0,3,0,1])

def move_zeros(array):
    count=0
    for num in array:
        if num == 0:
            count +=1
            array.remove(0)
            
    return array +[0]*count

Ответы [ 5 ]

2 голосов
/ 19 июня 2020

Да, False == 0 будет оцениваться как True в Python, поэтому значения False удаляются из вашего массива.

В Python, True и False реализованы как одиночные , то есть все значения False указывают на один и тот же экземпляр. Следовательно, вы можете использовать оператор is, чтобы проверить, равно ли значение в точности этому синглтону.

False is 0 вернет False, а False == 0 вернет True.

0 голосов
/ 19 июня 2020

В вашем коде 2 проблемы:

  1. Вы напрямую изменили список , по которому вы повторяете - это всегда опасно .
  2. Другие ответы объяснили вам, почему False == 0 это True.

Я внес как можно меньше изменений в ваш код, чтобы исправить эти проблемы:

  1. Я создал новый пустой массив и вместо удаления «плохих» элементов из исходного списка добавил «хорошие» к этому новому массиву.

  2. Я тестировал и текущий элемент для его типа.


def move_zeros(array):
    count=0
    new_array = []
    for num in array:
        if num == 0 and type(num) is int:
            count +=1
        else:
            new_array.append(num)

    return new_array + [0]*count

Тест:

move_zeros([False,1,2,0,1,0,1,0,3,0,1])
[False, 1, 2, 1, 1, 3, 1, 0, 0, 0, 0]
0 голосов
/ 19 июня 2020

Да 0 оценивается как False, а 1 оценивается как True, используйте это

def move_zeros(obj):
    new_list = []
    zeros_list = []
    for item in obj:
        if item != 0 or is False:
            new_list.append(item)
        else:
            zeros_list.append(item)
    new_list.extend(zero_list)
    return new_list

Это добавляет все не 0 в один список и все 0 в другой, затем возвращает new_list после итерации по zeros_list и добавления их до конца new_list

0 голосов
/ 19 июня 2020

Да, действительно False == 0. Фактически, bool - это подтип int. Если вы хотите строго сравнить, если False равно 0, тогда к оператору if следует добавить другое сравнение.

Кроме того, не изменяйте список во время итерации по самому себе. Вместо этого создайте новый.

def move_zeros(list_):
    result = []
    zeros = 0
    for item in list_:
        if item == 0 and type(item) == int:
            zeros += 1
            continue
        result.append(item)
    return result + [0] * zeros

0 голосов
/ 19 июня 2020
x = len(lis)
y = []
for i in range(len(lis)):
    if lis[i]!=0:
        y.append(lis[i])
if len(y)!=len(lis):
    z = len(lis)-len(y)
    for i in range(z):
        y.append(0)

Похоже, это домашнее задание. С радостью помогу.

Изменить: используйте print (y), и вы получите то, что хотите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...