Python枚举 - 我不能看到什么?

时间:2016-05-01 17:32:14

标签: python enumerate

任何人都可以解释这里发生的事情,因为我感到很沮丧

我有一个模块范围的列表变量,其元素包含字段 - mylist with' n'条目,每个field1,field2..fieldx

我想在一个过程中访问它们,所以(有一些trace / debug语句)

class

第一个print语句给出值-4(这是正确的),第二个给出一个不同的值,0,在一个简单的一个语句步骤。 在我看来,lField被创建为具有默认值的新元素,但我不知道,也不理解为什么。为什么第二个print语句给出的值与第一个不同?

我做错了什么?或者,可能更有针对性,我不理解的是什么?

我在另一个论坛上问了这个问题,但没有人提出合理的解释。

2 个答案:

答案 0 :(得分:2)

enumerate()中,start未指定迭代的起始索引。它指定计数的起始值。 enumerate()遍历整个iterable,从第一个(索引0)到最后一个元素,无论start参数如何。

循环中的第一个print语句打印mylist[0].dataFieldCheckType,就像它应该的那样。你只是希望它是mylist[1].dataFieldCheckType

如果你想从第二个(索引1)开始获取列表的所有元素,只需将其切片:

mylist[1:]

如果您确实需要索引,请将切片与enumerate()组合:

enumerate(mylist[1:], start=1)

答案 1 :(得分:2)

enumerate为每个(index + start, value)迭代产生value个元组。可选的start参数用作 offset 值来计算生成的元组的第一个元素:

>>> a = ['hi', 'stack', 'overflow']
>>> for x in enumerate(a, -4):
...     x
... 
(-4, 'hi') # 0 + (-4)
(-3, 'stack') # 1 + (-4)
(-2, 'overflow') # 2 + (-4)

如果你想跳过一个可迭代的元素,但不想在内存中使用那个特定的片(你想做的就是迭代),使用itertools.islice

>>> from itertools import islice
>>> for x in islice(a, 2, None):
...     x
... 
'overflow'

当然,你可以将两者结合起来,以实现正义。

>>> for x in islice(enumerate(a), 0, 2):
...     x
... 
(0, 'hi')
(1, 'stack')
相关问题