【问题标题】:Taking a list and printing all of the indexes of the elements that aren't equal to 0获取一个列表并打印所有不等于 0 的元素的索引
【发布时间】:2019-10-02 16:42:39
【问题描述】:

我必须获取一个诸如 [2,2,0,2] 之类的列表,然后我需要为列表中不为 0 的元素返回一个新的索引列表,因此对于 [2, 2,0,2] 我需要返回 [0,1,3]。或者对于 [1,0,1,1] 我需要返回 [0,2,3]。

def test(B):
    for k in list(B):
        if k > 0:
            result = []
            for i in range(len(B)):
                result.append(i)
        return result
test([2,2,0,2])
->[0,1,2,3]

我的问题是所有索引都被返回,我试图解决这个问题但没有运气。如果有人可以帮助我,那就太好了,谢谢。

【问题讨论】:

  • 为什么要嵌套另一个 for 循环?这绝对没有必要。无论如何,该内部循环只是将列表复制到result,因此result 将始终是原始列表,(除非所有数字都小于或等于0,在这种情况下它将产生NameError )。如果你使用enumerate,你会让你的生活更轻松。

标签: python list indexing


【解决方案1】:

您可以使用enumerate 巧妙地实现这一点:

def legal(B):
    return [i for i, x in enumerate(B) if x]
    # or if you want to cover more than numbers
    # return [i for i, x in enumerate(B) if x != 0]

>>> legal([2,2,0,2])
[0, 1, 3]
>>> legal([1,0,1,1])
[0, 2, 3]

【讨论】:

  • schwobaseggl:我相信你已经在 return 后面找到了 cmets — 它的编写方式不仅仅涵盖数字,因为 truthiness 在 Python 中是确定的。
  • @martineau 取决于观点,我猜。如果B 仅包含数字,则行为将是所需的行为。如果可能有其他东西并且您想要排除的只是0s,那么替代方案将适用。这就是我所说的“封面”。
  • 我的意思很简单,使用if x 已经涵盖的不仅仅是数字,而if x != 0 的替代方案仅适用于数值。
【解决方案2】:

这应该做的工作:


def indices(some_list):
    indices_list = []
    for i in range(0, len(some_list)):
        if some_list[i] != 0:
            indices_list.append(i)
    return indices_list

【讨论】:

    【解决方案3】:

    你可以使用下面的列表理解

    ls = [2,2,0,2]
    
    ind = [i for i, val in enumerate(ls) if val!=0]
    
    print(ind)
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      def legal(B):
          result = []
          for i, k in enumerate(list(B)):
              if k > 0:
                  result.append(i)
              return result
      

      你为什么要list(B)?如果 B 不是列表,那么这应该有效。如果是,则应删除 list 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-28
        • 2018-02-22
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 2020-08-24
        • 2021-03-13
        • 1970-01-01
        相关资源
        最近更新 更多