将零移到最后:为啥我的 Python 代码未能通过 CodeWars 中的测试?

Posted

技术标签:

【中文标题】将零移到最后:为啥我的 Python 代码未能通过 CodeWars 中的测试?【英文标题】:Moving Zeros To The End: Why does my Python Code fail the test in CodeWars?将零移到最后:为什么我的 Python 代码未能通过 CodeWars 中的测试? 【发布时间】:2020-08-14 16:58:28 【问题描述】:

问题

问题链接: 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', 无, '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]

测试通过

测试通过

测试通过

测试通过

测试通过

测试通过

我的问题:

为什么我的答案未能通过 2 次测试?

【问题讨论】:

只需在循环中交换,并跟踪最后一个非零位置。 @EricWang 非常感谢您的想法:) 请提供代码解决方案。 这能回答你的问题吗? Moving Zeros To The End: Failing the test in CodeWars? 【参考方案1】:

因为你只是退出了a != 0 中的所有Falses。 False 是 0,0 是 False

更多详情:Is False == 0 and True == 1 an implementation detail or is it guaranteed by the language?

【讨论】:

【参考方案2】:

在 python 中,与整数相比,TrueFalse 值的行为等同于 10。请参阅The standard type hierarchy 中numbers.Integral 下的部分。这意味着在计算零时,False 也会被计算在内,并且在 lambda 中:

lambda a: a != 0

a != 0 的比较将过滤掉0False。纠正此问题的一种方法是将计数修改为过滤器,并在两个 lambdas 中检查 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

【讨论】:

你能更新我的代码吗?这会很有帮助:) 更新了代码和解释以包含计数,因为 count(0) 将同时计算零和 False 值。【参考方案3】:

将所有值更改为字符串,然后执行函数

【讨论】:

好主意。但我仍然更喜欢有代码的解决方案【参考方案4】:

你需要

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

【讨论】:

那行不通。请测试后添加代码 ['a', 'b', 无, 'c', 'd', 1, False, 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, False, 1, 0, 0, 0] 应该等于 [1, None, 2, False, 1, 0, 0]【参考方案5】:

我找到了这个答案并且它有效。我只是不明白它是如何工作的。

def move_zeros(a):
    a.sort(key=lambda v: v == 0)
    return a

【讨论】:

以上是关于将零移到最后:为啥我的 Python 代码未能通过 CodeWars 中的测试?的主要内容,如果未能解决你的问题,请参考以下文章

将零填充到 Python 列表

为啥按钮向左移动?

Python 未能为 dlib Ubuntu 构建***

为啥我会收到此代码的“wait_fences:未能收到回复”?

Python 2.7:将零添加到多值字典列表之间的大小差异并将其相加

c_cpp 将第一个元素加倍并将零移至结束