正在枚举lis类型的列表

2024-04-25 13:46:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有人能解释为什么我必须在调用枚举之前转换一个已经是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')]

如果有人能帮助解释为什么会这样,我们将不胜感激。你知道吗


Tags: 声明类型列表objectistypethomasat
2条回答

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

def my_func(my_list):
    return 4

如果执行my_func(l),它当然不会返回列表。嗯,enumerate()也是这样。它返回一个enumerate对象,而不是一个列表。但是,该对象是iterable,因此可以将其转换为列表。例如:

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

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

print(list(my_enumerate(l))

Python文档倾向于非常小心地说明函数返回的内容,docs for ^{}表示它返回一个枚举对象,而不是一个列表。(请注意,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))并不是令人讨厌的。你知道吗

相关问题 更多 >