返回列表元素和索引

时间:2013-08-28 16:22:30

标签: python

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

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

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

4 个答案:

答案 0 :(得分:5)

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

要获得索引和元素,您可以使用enumerate()

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

或者,更好的是你可以简单地使用List comprehension:

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分: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 :(得分:0)

def ash(lst):    
    return [(lst[x],x) for x in range(0,len(lst))]

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