手动枚举列表

时间:2013-04-21 12:51:30

标签: python

我正在试图弄清楚如何手动枚举列表,但是因为我无法弄清楚如何拆分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)]时。我该怎么做呢?

4 个答案:

答案 0 :(得分:3)

使用the enumerate() built-in

>>> 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)]