Python生成器非常有用.它们优于返回列表的函数.但是,你可以len(list_returning_function()).有办法len(generator_function())吗?
更新:
当然len(list(generator_function()))会工作.....
我正在尝试使用我在我正在创建的新生成器中创建的生成器.作为新发电机计算的一部分,它需要知道旧发电机的长度.但是我想将它们与发生器保持相同的属性,特别是 - 不要将整个列表保存在内存中,因为它可能很长.
更新2:
假设发生器即使从第一步开始就知道它的目标长度.此外,没有理由维护len()语法.示例 - 如果Python中的函数是对象,我不能将长度分配给新生成器可以访问的此对象的变量吗?
Python提供了一种很好的方法来获取渴望迭代的长度,len(x)也就是说.但是我找不到任何类似于生成器理解和函数所代表的惰性迭代.当然,写下这样的东西并不难:
def iterlen(x):
n = 0
try:
while True:
next(x)
n += 1
except StopIteration: pass
return n
Run Code Online (Sandbox Code Playgroud)
但我无法摆脱我重新实现自行车的感觉.
(当我输入这个函数时,一个想法让我大吃一惊:也许真的没有这样的功能,因为它"摧毁"了它的论点.虽然不是我的情况的问题).
PS:关于第一个答案 - 是的,类似的东西len(list(x))也会起作用,但这会大大增加内存的使用.
PPS:重新检查......无视PS,似乎我在尝试时犯了一个错误,它运行正常.抱歉,添麻烦了.
例如,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)
编辑:澄清,我明白整个文件必须阅读!我只是不想在内存中一次性=).
我想要一个删除列表中重复的任何数字的所有实例的代码。
例如:
Inputlist = [2, 3, 6, 6, 8, 9, 12, 12, 14]
Outputlist = [2,3,8,9,14]
Run Code Online (Sandbox Code Playgroud)
我已经尝试删除列表中的重复元素(通过使用“唯一”功能),但它仍然在列表中留下元素的单个实例!
seen = set()
uniq = []
for x in Outputlist:
if x not in seen:
uniq.append(x)
seen.add(x)
seen
Run Code Online (Sandbox Code Playgroud)
我也阅读了很多 StackOverflow 文章,但所有文章的不同之处在于他们正在搜索从两个不同列表中删除公共元素,或者他们希望每个元素只保留一个实例。我想简单地删除所有常见元素。
我有这两个实现来计算有限生成器的长度,同时保留数据以供进一步处理:
def count_generator1(generator):
'''- build a list with the generator data
- get the length of the data
- return both the length and the original data (in a list)
WARNING: the memory use is unbounded, and infinite generators will block this'''
l = list(generator)
return len(l), l
def count_generator2(generator):
'''- get two generators from the original generator
- get the length of the data from one of them
- return both the length and the original data, as returned …Run Code Online (Sandbox Code Playgroud) 在不将元素存储在内存中的情况下(通过迭代)计算可迭代对象中元素数量的最佳方法是什么?
现在,我只是在做sum(1 for x in iterable)。我本来希望能在里面找到什么itertools,但似乎什么也没有。
我有一个生成有限序列的生成器.为了确定这个序列的长度,我尝试了这两种方法:
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位)完成的
是否真的可以看到 itertools.Combination 或其他对象的 len() ,而不将其具体化到列表中?
我可以用阶乘得到梳子的基数或排列,......但我想要一些概括的东西。
谢谢
我有这些清单:
list_a = set(["A", "B", "C", "D", "E", "F"])
list_b = set(["1", "2", "3", "4", "5", "6"])
list_c = set(["red", "yellow", "blue", "green"])
Run Code Online (Sandbox Code Playgroud)
我想找到这些列表的可能组合总数(每个列表一个项目)
使用较小的列表很容易实现这一点
import itertools as it
list_set = [list_a, list_b, list_c]
len(list(it.product(*list_of_unq_vars)))
Run Code Online (Sandbox Code Playgroud)
这将返回组合的数量.
但是对于较大的列表,我遇到了一个记忆错误.
有没有办法以这种方式计算可能的组合数而不实际创建组合(如上所述)?
非常感谢,J
python ×11
generator ×4
iterator ×3
iterable ×2
count ×1
list ×1
python-2.7 ×1
python-3.x ×1
sequences ×1