我正在试图弄清楚如何手动枚举列表,但是因为我无法弄清楚如何拆分data
列表而陷入困境。这是我到目前为止的代码..
enumerated_list = []
data = [5, 10, 15]
for x in (data):
print(x)
for i in range(len(data)):
enumerate_rule = (i, x)
enumerated_list.append(enumerate_rule)
print(enumerated_list)
打印出来..
5
10
15
[(0, 15), (1, 15), (2, 15)]
当我追求的是[(0, 5), (1, 15), (2, 15)]
时。我该怎么做呢?
答案 0 :(得分:3)
>>> list(enumerate([5, 15, 15]))
[(0, 5), (1, 15), (2, 15)]
您的原始代码的错误在于您在循环中使用x
这一事实,但是,x
在该循环中不会发生变化,它只是从您打印值的上一个循环中留下的。
然而,这种方法做得不好。修复它需要通过索引循环,这是Python不打算做的事情 - 它很慢而且难以阅读。相反,我们按值循环。内置enumerate()
是为我们完成这项工作,因为这是一项相当常见的任务。
如果你真的不想使用enumerate()
(这应该只是为了学习的目的),那么还有更好的方法:
>>> from itertools import count
>>> list(zip(count(), [5, 15, 15]))
[(0, 5), (1, 15), (2, 15)]
这里我们使用zip()
,这是用于一次循环两组数据的python函数。这将返回每个iterable中第一个值的元组,然后返回每个迭代中的第二个元素等等......这样就可以得到我们在结合itertools.count()
时所需的结果,它可以实现它在锡上所说的内容。
如果你真的觉得需要手动建立一个列表,那么做一些比较unpythonic的pythonic方式就是:
enumerated_list = []
count = 0
for item in data:
enumerated_list.append((count, item))
count += 1
但是,请注意,通常情况下,人们会使用list comprehension来构建这样的列表 - 在这种情况下,只要有人这样做,使用其中一种早期方法就更有意义了。这种列表的生成效率低,难以阅读。
答案 1 :(得分:2)
因为x
遍历了`data中的每个元素,所以:
for x in (data):
print(x)
x
将是最后一个元素。这就是为什么你将15
作为每个元组中的第二个元素的原因:
[(0, 15), (1, 15), (2, 15)]
你只需要一个循环:
for i in range(len(data)):
enumerate_rule = (i, data[i]) # data[i] gets the ith element of data
enumerated_list.append(enumerate_rule)
答案 2 :(得分:1)
enumerate_rule = (i, x)
是问题所在。您每次使用相同的值(x
,列表中的最后一项)。将其更改为enumerate_rule = (i, data[i])
。
答案 3 :(得分:1)
我会使用普通的“for循环”但是使用enumerated(),所以你可以在循环中使用索引i:
enumerated_list=[]
data = [5, 10, 15]
for i,f in enumerate(data):
enumerated_list.append((i,f))
print enumerated_list
结果:
[(0, 5), (1, 15), (2, 15)]