【问题标题】:Find first non zero numbers in an array (zeroes can be anywhere)在数组中查找第一个非零数(零可以在任何地方)
【发布时间】:2021-02-26 18:33:31
【问题描述】:

假设我们有一个数组:x = [10,0,30,40]。我想提取第一个非零元素并将其存储在不同的变量中,例如y。在此示例中,y = 10。我们也可以有很多零,x = [0,0,30,40],应该将y = 30 作为提取值。

我尝试了这样的 Python sn-p:

i = 0
while x[i] != 0:
  y = arr[i]
  if x[i] == 0:
     break

这仅在数组为[10,0,30,40] 时有效。如果我有0,20,30,40,它就不起作用。循环将在此之前停止。什么是实现这一点的有效方法?我尽量不使用任何特殊的 Numpy 函数,只使用通用的通用循环,因为我可能需要将它移植到其他语言。

【问题讨论】:

    标签: python arrays algorithm


    【解决方案1】:

    你可以这样做

    x = [10,0,30,40]
    for var in x:
        if var != 0:
            y = var
            break
    

    【讨论】:

    • 您不需要额外的变量。即使在break 之后,var 仍将保持循环的最后一个值。然后您可以使用for-else 来查看循环是否完成(即没有找到非零)
    【解决方案2】:

    您可以使用列表推导来获取所有非零值,然后如果有一些非零值提取第一个值。

    x = [10,0,30,40]
    
    lst = [v for v in x if v != 0]
    
    if lst:
      y = lst[0]
      print(y)
    

    【讨论】:

      【解决方案3】:

      你的代码的问题是你没有增加i 所以它卡在第一个元素上。所以你可以做些什么来保持代码的可移植性:

      while x[i] != 0:
        y = x[i]
        if x[i] == 0:
           break
        i+=1
      
      

      这段代码仍然不干净,因为如果你的数组中没有0,那么一旦你到达末尾,你就会得到一个IndexError

      【讨论】:

        【解决方案4】:

        我对此有点陌生,但我认为这应该可行:

        x = [0, 12, 24, 32, 0, 11]
        y = []
        for num in x:
             if num != 0:
                 y.append(num)
                 break
        print(y)
        

        【讨论】:

          【解决方案5】:

          你可以使用下一个函数:

          x = [10,0,30,40]
          next(n for n in x if n) # 10
          
          x = [0,0,30,40]
          next(n for n in x if n) # 30
          

          如果需要支持列表中不存在零,可以使用next()函数的第二个参数:

          x = [0,0,0,0]
          next((n for n in x if n),0) # 0
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-08
            • 1970-01-01
            • 2013-01-29
            • 1970-01-01
            • 1970-01-01
            • 2015-09-17
            • 1970-01-01
            相关资源
            最近更新 更多