【问题标题】:How to not evaluate False/other values as 0如何不将 False/其他值评估为 0
【发布时间】:2019-04-19 05:56:51
【问题描述】:
def move_zeros(array):
    no_zero = [i for i in list(array) if i != int(0)]
    print(array)
    print(no_zero)

    for i in range(array.count(0)):
        no_zero.append(0)

    return no_zero

这是我用于 codeacademy kata 的代码,其目的是将列表数组中的所有零移动到数组的前面。我的代码在大多数情况下都可以工作,但是在某些情况下代码会卡住,例如它将 False 视为零以及诸如 0.0 之类的值,我该如何更改它以使其影响文字数字 0

编辑:被要求提供预期算法的示例输出

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

而我的代码返回

[1, 1, 2, 1, 3, 'a', 0, 0, 0]

【问题讨论】:

  • str(i) == "0"
  • 当我执行这个脚本时,我可以看到零被移到了列表的最后?算法正确吗?您可以将示例输入和输出与问题一起添加吗?
  • 是的@SwadhikarC,这是算法的预期目标:)

标签: python arrays loops


【解决方案1】:

编辑:

def move_zeros(array):
    result = array[:]
    # add here any false value you want
    false_values = [0, 0.0, "0", "0.0", False, ""]
    for i in result:
        if i in false_values:
            result.append(i)  # or "0" or "0.0"
            del result[result.index(i)]
    return result

【讨论】:

  • >>> def move_zeros(array): ... result = array[:] ... for i in range(len(result)): ... if result[i] == 0: # or "0" or "0.0" ... ... del result[i] ... result.append(0) ... return result ... >>> move_zeros([1, 2, 0 , False, 0.0, 'string', 0, 0, 0, -1]) [1, 2, False, 'string', 0, -1, 0, 0, 0, 0]
【解决方案2】:

False 确实是0,因为bool 是int 的子类。

False 的值虽然是单例,但您可以随时检查 if i is False 以将其与 0 区分开来。

整数0 也是一个单例,但这是一个实现细节,而不是语言的保证。我宁愿不依赖它。

要排除float 值0.0,您始终可以测试确切的类型:if type(i) is int。 int 的子类将无法通过此测试。

【讨论】:

  • 更准确地说,0可能是单例,但就像你说的,这是一个你不能依赖的实现细节,所以它是最好只是假设它在您编写的任何代码中不是单例。
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2015-03-15
  • 2019-04-27
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多