【问题标题】:Returning list elements and indices [duplicate]返回列表元素和索引
【发布时间】:2013-08-28 16:22:29
【问题描述】:

我正在尝试使用用户制作的功能打印列表的所有元素。

y = [1,2,3]
def ash(list1):
for x in range(len(list)):
    return list[x],x

我想要做的是返回列表中的所有值及其索引,但我得到的只是一个元素。我可以让元素打印但不能返回。

【问题讨论】:

    标签: python


    【解决方案1】:

    您将在第一次迭代中返回。相反,您需要在函数中创建一个列表,并将所有元组添加到该列表中,最后返回该列表。

    对于同时获取索引和元素,您可以使用enumerate()

    def ash(list1):
        new_list = []
        for x, elem in enumerate(list1):
            new_list.append((elem,x))
        return new_list
    

    或者,你可以简单地使用列表理解更好:

    return [(elem, x) for x, elem in enumerate(list1)]
    

    前两种方法在内存中创建列表。如果您有一个非常大的列表要处理,那么您可能应该使用生成器,使用 yield 关键字:

    def ash(list1):
        for x, elem in enumerate(list1):
            yield elem, x
    

    【讨论】:

    • 这是一种糟糕的做法。
    • @Marcin。你能解释一下吗?
    • @Marcin。已经添加了理解。请刷新页面。
    • 我仍然认为您的第一个 sn-p 方法很差。
    • @Marcin。我添加了这一点以向 OP 展示他的代码有什么问题。然后我添加了更好的选择。这有什么问题?
    【解决方案2】:

    您的代码存在一些问题:

    1. 除非必要,否则不要使用range 进行迭代。直接迭代列表,或者在这里,使用enumerate
    2. 不要使用list 作为变量 - 你会隐藏同名的内置函数。这让读者感到困惑。
    3. 您正在退出循环。这就是为什么您只获得第一次迭代的原因。如果你想返回连续的值,使用yield,它将你的函数变成一个生成器:

      def ash(l):
          for x in range(len(l)):
              yield l[x],x
      
    4. 这真的是enumerate的重新实现:

      list(enumerate('abc')) #=> [(0, 'a'), (1, 'b'), (2, 'c')]
      
    5. 如果你真的想交换对的顺序,你可以这样做:

      [b,a for a,b in enumerate('abc')]
      
    6. 替代实现:l='abc';zip(l,xrange(len(l)))

    【讨论】:

      【解决方案3】:

      enumerate(list) 是您正在寻找的。 (see doc)。另外,调用return 只会在调用函数时给你列表的第一个值,你想要的可能是yield statement

      def ash(list):
      
        for i,item in enumerate(list):
          yield item,i
      
      if __name__ == '__main__':
      
        y = [1,2,3]
      
        ys_with_indices = list(ash(y)) 
        print ys_with_indices
      

      请注意,这将返回一个生成器对象,您必须通过调用 list() 将其转换为列表。或者,只需使用将单个值附加到的普通列表:

      def ash(list):
      
        items_with_indices = []
      
        for i,item in enumerate(list):
          items_with_indices.append((item,i))
      
        return items_with_indices
      
      if __name__ == '__main__':
      
        y = [1,2,3]
      
        ys_with_indices = ash(y)
        print ys_with_indices
      

      【讨论】:

      • 虽然这是从序列中获取值和索引的更好方法,但它并不能解决实际问题。
      • 好的,我添加了一个示例,展示了如何从生成器制作列表以及使用普通列表的替代版本。
      • -1 使用list 作为变量名;追加到列表而不是使用理解。
      • wtf,我只是使用了作者在他的问题中使用的变量名......
      【解决方案4】:
      def ash(lst):    
          return [(lst[x],x) for x in range(0,len(lst))]
      

      您将获得一个元组列表,其中元组的第一个值是原始列表的元素,第二个值是列表中元素的索引。 对于 y = [1,2,3],结果为 [(1, 0), (2, 1), (3, 2)]

      【讨论】:

      • 为什么要按索引迭代?
      • 不错的 Pythonic 解决方案。
      • @Marcin 获取列表的索引和元素!
      • 如果您坚持使用枚举,或使用范围压缩。
      猜你喜欢
      • 2020-12-01
      • 1970-01-01
      • 2021-09-08
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多