【问题标题】:enumerating list already of type list枚举列表已经是列表类型
【发布时间】:2016-05-06 15:33:25
【问题描述】:

我想知道是否有好心人可以解释为什么我必须在调用 enumerate 之前转换一个已经是 list 类型的列表。

>>> l = ['russell', 'bird', 'thomas']
>>> print(type(l))
Type is: `class 'list'`.

如果我在没有明确声明的情况下枚举此列表,则输出如下:

>>> print(enumerate(l))
enumerate object at 0x00B1A0F8

当显式将此列表声明为列表时,输出如预期:

>>> print(list(enumerate(l)))
[(0, 'russell'), (1, 'bird'), (2, 'thomas')]

如果有人可以帮助解释为什么会这样,将不胜感激。

【问题讨论】:

  • 你说的这个显式声明在哪里? Python 不这样做。你的意思是list(enumerate(l))?这并不是将l 声明为一个列表,而是从l 列表对象创建的枚举对象生成一个列表对象。
  • 您预期的输出错误。 enumerate不应该生成一个列表。
  • 因为enumerate 对象是iterator 而不是列表,就像iter(l) 一样。
  • 重新开放,因为它不再不清楚

标签: python list python-3.x indexof enumerate


【解决方案1】:

这里有两个不同的对象。假设您定义了一个函数:

def my_func(my_list):
    return 4

如果你做了my_func(l),当然它不会返回一个列表。好吧,enumerate() 也是这样。它返回一个enumerate 对象,而不是一个列表。但是,该对象是可迭代的,因此可以将其转换为列表。例如:

def my_enumerate(my_list):
    index = 0
    for item in my_list:
        yield index, item
        index += 1

这就是enumerate 的工作原理。我们的函数是一个生成器函数并返回一个生成器对象。由于生成器是可迭代的,因此您可以将其转换为列表:

print(list(my_enumerate(l))

【讨论】:

    【解决方案2】:

    Python 文档在说明函数返回什么时往往非常小心,docs for enumerate() 说它返回一个枚举对象,而不是一个列表。 (请注意,Python 2 中已经存在这种情况。)

    虽然必须明确地创建一个完整的列表似乎有点痛苦,比如

    print(list(enumerate(mylist)))
    

    返回列表的优点是它可以更快并且使用更少的内存。预计在实际使用中,您通常不会一次需要整个列表,而是一次循环遍历元素,例如

    for i, elem in enumerate(mylist):
        print(i, '->', elem)
    

    您甚至可能不会使用所有元素:

    mylist = ['russell', 'bird', 'thomas']
    for i, elem in enumerate(mylist):
        if elem == 'bird':
            break
        print((i, elem))
    

    所以enumerate() 为您提供了仅根据需要而不是一次性生成项目的效率。 (想象一下,如果您正在处理历史上所有 NBA 球员的名单,而不仅仅是您示例中的三名球员。)在极少数情况下,您确实确实需要一次所有物品,这不是 em> 不得不输入 list(enumerate(mylist)) 很烦人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多