【发布时间】:2013-08-28 16:22:29
【问题描述】:
我正在尝试使用用户制作的功能打印列表的所有元素。
y = [1,2,3]
def ash(list1):
for x in range(len(list)):
return list[x],x
我想要做的是返回列表中的所有值及其索引,但我得到的只是一个元素。我可以让元素打印但不能返回。
【问题讨论】:
标签: python
我正在尝试使用用户制作的功能打印列表的所有元素。
y = [1,2,3]
def ash(list1):
for x in range(len(list)):
return list[x],x
我想要做的是返回列表中的所有值及其索引,但我得到的只是一个元素。我可以让元素打印但不能返回。
【问题讨论】:
标签: python
您将在第一次迭代中返回。相反,您需要在函数中创建一个列表,并将所有元组添加到该列表中,最后返回该列表。
对于同时获取索引和元素,您可以使用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
【讨论】:
您的代码存在一些问题:
range 进行迭代。直接迭代列表,或者在这里,使用enumerate
list 作为变量 - 你会隐藏同名的内置函数。这让读者感到困惑。 您正在退出循环。这就是为什么您只获得第一次迭代的原因。如果你想返回连续的值,使用yield,它将你的函数变成一个生成器:
def ash(l):
for x in range(len(l)):
yield l[x],x
这真的是enumerate的重新实现:
list(enumerate('abc')) #=> [(0, 'a'), (1, 'b'), (2, 'c')]
如果你真的想交换对的顺序,你可以这样做:
[b,a for a,b in enumerate('abc')]
替代实现:l='abc';zip(l,xrange(len(l)))
【讨论】:
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
【讨论】:
list 作为变量名;追加到列表而不是使用理解。
def ash(lst):
return [(lst[x],x) for x in range(0,len(lst))]
您将获得一个元组列表,其中元组的第一个值是原始列表的元素,第二个值是列表中元素的索引。
对于 y = [1,2,3],结果为 [(1, 0), (2, 1), (3, 2)]
【讨论】: