相关疑难解决方法(0)

如何len(generator())

Python生成器非常有用.它们优于返回列表的函数.但是,你可以len(list_returning_function()).有办法len(generator_function())吗?

更新:
当然len(list(generator_function()))会工作.....
我正在尝试使用我在我正在创建的新生成器中创建的生成器.作为新发电机计算的一部分,它需要知道旧发电机的长度.但是我想将它们与发生器保持相同的属性,特别是 - 不要将整个列表保存在内存中,因为它可能长.

更新2:
假设发生器即使从第一步开始就知道它的目标长度.此外,没有理由维护len()语法.示例 - 如果Python中的函数是对象,我不能将长度分配给新生成器可以访问的此对象的变量吗?

python generator

128
推荐指数
8
解决办法
9万
查看次数

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

有没有一种有效的方法来了解Python中迭代器中有多少元素,一般来说,没有遍历每个元素并进行计数?

python iterator

117
推荐指数
10
解决办法
10万
查看次数

计算生成器/迭代器中项目数的最短方法是什么?

如果我想要迭代中的项目数量而不关心元素本身,那么获得该元素的pythonic方法是什么?现在,我会定义

def ilen(it):
    return sum(itertools.imap(lambda _: 1, it))    # or just map in Python 3
Run Code Online (Sandbox Code Playgroud)

但我明白lambda接近被认为是有害的,lambda _: 1当然不是很漂亮.

(这个用例是计算匹配正则表达式的文本文件中的行数,即grep -c.)

python iterator iterable generator

60
推荐指数
5
解决办法
3万
查看次数

有没有内置的方法来获取python中迭代的长度?

例如,Python中的文件是可迭代的 - 它们遍历文件中的行.我想计算行数.

一个快速的方法是这样做:

lines = len(list(open(fname)))
Run Code Online (Sandbox Code Playgroud)

但是,这会将整个文件加载到内存中(一次).这相当违背了迭代器的目的(它只需要将当前行保留在内存中).

这不起作用:

lines = len(line for line in open(fname))
Run Code Online (Sandbox Code Playgroud)

因为发电机没有长度.

有没有办法做到这一点,没有定义计数功能?

def count(i):
    c = 0
    for el in i: c += 1
    return c
Run Code Online (Sandbox Code Playgroud)

编辑:澄清,我明白整个文件必须阅读!我只是不想在内存中一次性=).

python iterator

47
推荐指数
6
解决办法
2万
查看次数

如何测量发电机序列的长度(列表补偿与发电机表达)

我有一个生成有限序列的生成器.为了确定这个序列的长度,我尝试了这两种方法:

 seq_len = sum([1 for _ in euler14_seq(sv)])  # list comp
Run Code Online (Sandbox Code Playgroud)

 seq_len = sum(1 for _ in euler14_seq(sv))    # generator expression
Run Code Online (Sandbox Code Playgroud)

sv 是序列的常量起始值.

我原本以为列表理解会慢一点,生成器表达式会更快,但事实证明相反.

我假设第一个会占用更多的内存,因为它首先在内存中创建一个完整的列表 - 部分原因我还认为它会更慢.

我的问题:这种观察是否可以推广?这是因为第二个声明与第一个声明中涉及两个发生器吗?

我看过这些什么是计算生成器/迭代器中项目数的最短方法?,生成器输出的长度, 是否有任何内置的方法来获取python中迭代的长度?并且看到了一些测量序列长度的其他方法,但我对list comp与generator表达式的比较特别好奇.

PS:当我决定根据昨天提出的问题解决欧拉项目#14时出现了这个问题.

(顺便说一句,关于使用'_'不需要变量值的地方的一般感觉是什么).

这是在Windows 7 64位下使用Python 2.7.2(32位)完成的

python sequences list-comprehension generator python-2.7

2
推荐指数
1
解决办法
3265
查看次数

使用生成器进行计数的最佳做法是什么

假设我有一个列表:

my_list = range(10)
Run Code Online (Sandbox Code Playgroud)

而且我想计算列表中有多少偶数.请注意,我对这些值不感兴趣,我只想要它们的数量.所以我可以:

len( [0 for i in my_list if i % 2 == 0] ) # Method 1
len( [i for i in my_list if i % 2 == 0] ) # Method 2
len( [_ for i in my_list if i % 2 == 0] ) # Method 3
Run Code Online (Sandbox Code Playgroud)

从速度或内存的角度来看,上述任何一种方法都比其他方法更好吗?

实际上我甚至不需要构建列表,但我不想:

counter = 0
for item in my_list:
   if item % 2 == 0:
      counter += 1
Run Code Online (Sandbox Code Playgroud)

那么,哪一个是用发电机计数的好方法?

PS:我的案例中的列表有更多内存繁重的项目,这就是为什么我想要尽可能优化.

python generator count

0
推荐指数
1
解决办法
58
查看次数