Почему 0.0 не учитывается? - PullRequest
0 голосов
/ 26 сентября 2019

Попытка составить список, который ставит нули в конец.И он игнорирует 0.0, которое также нужно поставить в конце как 0. Почему это происходит?

Пробовал с помощью float(0)/ 0.0.Это работает, если я изменяю его на другое целое число, только не 0.0.

Желаемый вывод [9, 9, 1, 2, 1, 1, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

def move_zeros(array):
    count = 0
    for x in array: #counts how many zeros
        if x is 0 or float(0):
            count+=1
    array = [x for x in array if x is not 0] # removes all zeros
    array = [x for x in array if x is not float(0)]
    for y in range(count):
        array.append(0) #tacks zero to the end of list

    print(array)

move_zeros([9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9])

Ожидается, что будет работать, но игнорирует 0.0

Ответы [ 4 ]

1 голос
/ 26 сентября 2019

is вернет True, если две переменные указывают на один и тот же объект, == если объекты, на которые ссылаются переменные, равны.

См. это отличноответьте для более подробного объяснения разницы между is и ==.

Как указано в других ответах, вы должны использовать == и != в вашем случае, так как вы проверяете, если значения равны, а не если два объекта являются одинаковыми объектами в памяти.

Вот ваш код с исправленными ошибками:

def move_zeros(array):
    count = 0
    result = []
    for x in array: #counts how many zeros
        if x == 0 or x == float(0):
            count+=1

        elif x is not False and x is not None:
            result.append(x)

    for y in range(count):
        result.append(0) #tacks zero to the end of list

    print(result)

move_zeros([9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9])
0 голосов
/ 26 сентября 2019

Примечание о or:

  • x == 0 or x == float(0) работает
  • x in [0, float(0)] также работает и проще
    • [x for x in array if x != 0] & [x for x in array if x != float(0)]можно заменить на [x for x in array if x not in [0, float(0)]]

Упростить функцию

def move_zeros(array):
    zc = array.count(0)
    array = [x for x in array if x != 0] # removes all zeros
    array.extend([0 for _ in range(zc)])

    return array

test = [9, 0.0, 0, 9, 1, 2, 0, 1, 0, 1, 0.0, 3, 0, 1, 9, 0, 0, 0, 0, 9]

y = move_zeros(test)

print(y)

>>> [9, 9, 1, 2, 1, 1, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Проверка y против test:

from collections import Counter

print(test.count(0))
>>> 10

print(y.count(0))
>>> 10

print(len(test))
>>> 20

print(len(y))
>>> 20

test_dict = Counter(test)
print(test_dict)
>>> Counter({9: 4, 0.0: 10, 1: 4, 2: 1, 3: 1})

y_dict = Counter(test)
print(y_dict)
>>> Counter({9: 4, 0.0: 10, 1: 4, 2: 1, 3: 1})

В качестве альтернативы:

test = [9, 0.0, 0, 9, 1, 2, 0, 1, 0, 1, 0.0, 3, 0, 1, 9, 0, 0, 0, 0, 9]

test_sorted = test.sort(reverse=True)
print(test_sorted)
>>> [9, 9, 9, 9, 3, 2, 1, 1, 1, 1, 0.0, 0, 0, 0, 0.0, 0, 0, 0, 0, 0]
0 голосов
/ 26 сентября 2019

Есть несколько проблем:

  1. is оценивает, являются ли два объекта одним и тем же объектом в памяти.Вы хотите использовать ==.
  2. if x is 0 or float(0) - недопустимый код.Вместо этого используйте if x is 0 or x == float(0) или if x in (0, float(0).Вам на самом деле не нужно различать 0 и float(0).Просто используйте if x == 0 или if not x.
  3. Эта проблема повторяется в ваших списках.Используйте x != 0 или просто x вместо is not.
0 голосов
/ 26 сентября 2019

Вы не должны использовать is для выполнения арифметических сравнений, и вы не можете объединить два условия, используя or, как это.Измените условие следующим образом:

if x == 0:

Аналогичным образом исправьте условия в ваших списках (x != 0 вместо x is not 0).

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