0

我试图弄清楚如何手动枚举列表但是我被卡住了,因为我无法弄清楚如何拆分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

4 回答 4

3

使用内置_enumerate()

>>> 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函数。这从每个可迭代返回第一个值的元组,然后从每个返回第二个值的元组,等等......这给了我们在与 结合时我们想要的结果itertools.count(),它在锡上所说的那样。

如果你真的觉得需要手动构建一个列表,那么做一些非 Python 的更 Python 的方式是:

enumerated_list = []
count = 0
for item in data:
    enumerated_list.append((count, item))
    count += 1

但是请注意,通常,人们会使用列表推导来构建这样的列表 - 在这种情况下,一旦这样做,使用早期方法之一会更有意义。这种列表的产生效率低下且难以阅读。

于 2013-04-21T12:52:55.967 回答
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)
于 2013-04-21T12:53:55.537 回答
1

enumerate_rule = (i, x)是问题所在。x您每次都使用相同的值( ,列表中的最后一项)。将其更改为enumerate_rule = (i, data[i]).

于 2013-04-21T12:54:01.650 回答
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)]
于 2013-04-21T13:31:29.900 回答