Перемещение нулей в конец: почему мой Python код не прошел тест в CodeWars? - PullRequest
3 голосов
/ 30 апреля 2020

Задача

Ссылка на проблему: https://www.codewars.com/kata/52597aa56021e91c93000cb0/train/python

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

move_zeros([false,1,0,1,2,0,1,3,"a"]) # returns[false,1,1,2,1,3,"a",0,0]

Мой код:

def move_zeros(array):
    zero_count = array.count(0)
    array1 = list(filter(lambda a: a != 0, array)) + [0 for i in range(zero_count)]
    return array1

Примеры тестов:

Test.describe("Basic tests")
Test.assert_equals(move_zeros([1,2,0,1,0,1,0,3,0,1]),[ 1, 2, 1, 1, 3, 1, 0, 0, 0, 0 ])
Test.assert_equals(move_zeros([9,0.0,0,9,1,2,0,1,0,1,0.0,3,0,1,9,0,0,0,0,9]),[9,9,1,2,1,1,3,1,9,9,0,0,0,0,0,0,0,0,0,0])
Test.assert_equals(move_zeros(["a",0,0,"b","c","d",0,1,0,1,0,3,0,1,9,0,0,0,0,9]),["a","b","c","d",1,1,3,1,9,9,0,0,0,0,0,0,0,0,0,0])
Test.assert_equals(move_zeros(["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]),["a","b",None,"c","d",1,False,1,3,[],1,9,{},9,0,0,0,0,0,0,0,0,0,0])
Test.assert_equals(move_zeros([0,1,None,2,False,1,0]),[1,None,2,False,1,0,0])
Test.assert_equals(move_zeros(["a","b"]),["a","b"])
Test.assert_equals(move_zeros(["a"]),["a"])
Test.assert_equals(move_zeros([0,0]),[0,0])
Test.assert_equals(move_zeros([0]),[0])
Test.assert_equals(move_zeros([False]),[False])
Test.assert_equals(move_zeros([]),[])

Мой вывод после запуска:

  • Пройденный тест

  • Тест пройден

  • Тест пройден

  • ['a', 'b', None, 'c ',' d ', 1, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] должно быть равно [ 'a', 'b', None, 'c', 'd', 1, False, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

  • [1, None, 2, 1, 0, 0, 0] должно равняться [1, None, 2, False, 1, 0, 0]

  • Пройденный тест

  • Пройденный тест

  • Тест пройден

  • Тест пройден

  • Тест Pas sed

  • Пройдено тестирование

Мой вопрос:

Почему мой ответ не прошел 2 теста ?

Ответы [ 4 ]

0 голосов
/ 01 мая 2020

Вам нужно

def move_zeros(array):
    zero_count = array.count(0)
    array1 = list(filter(lambda a: a != 0 or isinstance(a, bool), array)) + [0 for i in range(zero_count)]
    return array1
0 голосов
/ 30 апреля 2020

В python значения True и False ведут себя как эквивалентные 1 и 0 по сравнению с целыми числами. См. Раздел numbers.Integral в Иерархия стандартных типов . Это означает, что при подсчете нулей будет также учитываться False, а в лямбда-выражении:

lambda a: a != 0

Сравнение a != 0 отфильтрует и 0, и False. Один из способов исправить это - изменить счетчик, чтобы он также был фильтром, и проверить в обеих лямбдах, что a не является логическим значением:

def move_zeros(array):
    zero_list = list(filter(lambda a: a == 0 and not isinstance(a, bool), array))
    array1 = list(filter(lambda a: a != 0 or isinstance(a, bool), array)) + zero_list
    return array1
0 голосов
/ 01 мая 2020

изменить все значения строки и затем выполнить функцию

0 голосов
/ 30 апреля 2020

Потому что вы просто пропускаете все False с в a != 0. False равно 0, а 0 - False.

Дополнительные сведения: Является ли False == 0 и True == 1 подробностями реализации или это гарантировано языком?

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