首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中获取迭代器中的元素数量

在Python中获取迭代器中的元素数量
EN

Stack Overflow用户
提问于 2010-07-28 00:32:21
回答 13查看 167.5K关注 0票数 177

一般来说,有没有一种有效的方法可以知道在Python中一个迭代器中有多少元素,而不需要遍历每个元素并进行计数?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-07-28 00:42:54

不是的。这不可能。

示例:

代码语言:javascript
复制
import random

def gen(n):
    for i in xrange(n):
        if random.randint(0, 1) == 0:
            yield i

iterator = gen(10)

在遍历iterator之前,它的长度是未知的。

票数 123
EN

Stack Overflow用户

发布于 2010-07-28 00:34:51

不,任何方法都需要你解析每一个结果。你可以做到

代码语言:javascript
复制
iter_length = len(list(iterable))

但是在无限迭代器上运行它当然永远不会返回。它还将消耗迭代器,如果您想使用内容,则需要对其进行重置。

告诉我们您试图解决的实际问题可能会帮助我们找到更好的方法来实现您的实际目标。

编辑:使用list()会一次将整个可迭代内容读取到内存中,这可能是不可取的。另一种方法是

代码语言:javascript
复制
sum(1 for _ in iterable)

就像另一个人发布的那样。这将避免将其保存在内存中。

票数 79
EN

Stack Overflow用户

发布于 2013-02-27 20:22:39

您不能(除非特定迭代器的类型实现了一些特定的方法,从而使其成为可能)。

通常,您只能通过使用迭代器来计算迭代器项。可能是最有效的方法之一:

代码语言:javascript
复制
import itertools
from collections import deque

def count_iter_items(iterable):
    """
    Consume an iterable not reading it into memory; return the number of items.
    """
    counter = itertools.count()
    deque(itertools.izip(iterable, counter), maxlen=0)  # (consume at C speed)
    return next(counter)

(对于Python3.x,将itertools.izip替换为zip)。

票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3345785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档