【问题标题】:Moving Zeros To The End: Failing the test in CodeWars?将零移到最后:在 CodeWars 中未通过测试?
【发布时间】:2020-08-22 23:11:04
【问题描述】:

问题

问题链接: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):
    list = []
    list2 = []
    for n in array:
        if n is 0:
            list2.append(n)
        else:
            list.append(n)
    return list + list2

样本测试:

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([]),[])

我的输出:

  • 测试通过
  • [9, 0.0, 9, 1, 2, 1, 1, 0.0, 3, 1, 9, 9, 0, 0, 0, 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]
  • 测试通过
  • 测试通过
  • 测试通过
  • 测试通过
  • 测试通过
  • 测试通过
  • 测试通过
  • 测试通过
  • 测试通过

我的问题:

我相信它会失败,因为 0.0 不是 0。但我很难理解我该如何写。 我正在开始编码,所以我的代码看起来不像 Python,但我想这是我必须练习的东西

【问题讨论】:

    标签: python arrays algorithm sorting optimization


    【解决方案1】:

    用途:

    n == 0 and n is not False
    

    根据https://docs.python.org/3/library/stdtypes.html

    共有三种不同的数字类型:整数、浮点数和复数。另外,布尔值是整数的子类型

    不同类型的对象,除了不同的数值类型,永远不会比较相等

    【讨论】:

      【解决方案2】:

      您可以使用if n is 0 or n == 0.0 and type(n) == float。 (或type(0.0) 而不是float

      我不知道为什么if n is 0 or n is 0.0 不起作用。如果有人这样做,请发表评论。

      【讨论】:

      • 你能解释一下为什么,在测试号 6 中,当在循环中时 n=FalseTrue 在条件 if n == 0 中返回,但如果条件为 if n is 0,则返回 False
      • 查看 One Lyner 的回答。 False 是一个布尔值,在 Python 中它是整数的子类型,因此 False 可以与 0 进行比较,但它而不是 0
      • @anatolyg 对...我认为这是因为浮点值的共享方式与整数值不同。我猜n is 0 也不能保证能正常工作。
      【解决方案3】:

      只需使用== 而不是is0 is 0.0 返回 False,但 0 == 0.0 返回 True

      【讨论】:

      • 如果我这样做,只要在其他测试中显示“False”,python 就会认为False == 0 然后代码也不起作用。示例:(teste number 4) ['a', 'b', None, 'c', 'd', 1, 1, 3, [], 1, 9, {}, 9, 0, 0, 0, False, 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]
      • 啊,所以False不应该被移动?在这种情况下,使用n == 0 and type(n) in (int, float)
      • 最好排除False:有几种数字类型(numpy 有更多),您可能希望支持所有这些类型。 n == 0 and n is not False.
      猜你喜欢
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多