我正在尝试使用用户制作的函数打印列表的所有元素。
y = [1,2,3]
def ash(list1):
for x in range(len(list)):
return list[x],x
我想要做的是返回列表中的所有值及其索引,但我得到的只是一个元素。我可以获取要打印但不返回的元素。
答案 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)
您的代码存在一些问题:
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)))
答案 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)]