【问题标题】:Python enumerate - what cannot I see?Python 枚举 - 我看不到什么?
【发布时间】:2016-05-01 17:32:14
【问题描述】:

谁能解释一下这里发生了什么,因为我很困惑

我有一个模块范围的列表变量,其中包含具有字段的元素 - mylist 具有“n”个条目,每个字段 1、字段 2..fieldx

我想在一个过程中访问它们,所以有(带有一些跟踪/调试语句)

print mylist [1].dataFieldCheckType

for lIndex, lField in enumerate(mylist, start = 1):

    print lField.dataFieldCheckType

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

我做错了什么?或者,可能更贴切的是,我不明白什么?

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

【问题讨论】:

  • 我花了一段时间才明白你在问什么——起初我以为你说 0 是错误的,但并没有说它应该是什么。然后在重读了很多次之后,我猜你期待第二个print 打印-4。我编辑了您的问题以澄清这一点。如果我理解错了请回滚。

标签: python enumerate


【解决方案1】:

enumerate() 中,start 没有指定可迭代对象的起始索引。它指定计数的起始值。 enumerate() 迭代整个可迭代对象,从第一个(索引 0)到最后一个元素,与 start 参数无关。

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

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

mylist[1:]

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

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

【讨论】:

  • 谢谢,谢谢,谢谢!!
  • 这种语言的怪癖之一与设计所说的应该发生的事情背道而驰。哦,我确实想念我的汇编语言程序 - 你知道当时发生了什么!
  • @ADB 是的,start 是该参数的一个非常模糊的名称。我猜逻辑是“枚举这些项目使用开始的数字
  • @ADB 如果您认为您的问题已在此页面上得到解答,最好接受(标有绿色复选标记)我们的任何回答都有助于最好或最有效地回答您的问题。
【解决方案2】:

enumerate 为可迭代的每个 value 生成 (index + start, 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多