列举已列出类型列表的列表

时间:2016-05-06 15:33:25

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

我想知道是否有某种灵魂可以解释为什么我必须在调用enumerate之前转换已经是类型列表的列表。

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

如果有人可以帮助解释为什么会这样,那么我们将非常感激。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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球员的名单,而不仅仅是您示例中的三个球员。)在极少数情况下,您确实需要同时拥有所有项目,但不是 恼人的是必须输入list(enumerate(mylist))