gpt4 book ai didi

python - 计算条件行数的优化方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:29 24 4
gpt4 key购买 nike

我已经看到一种快速计算文件行数的方法是这样做的:

n_lines=sum(1 for line in open(myfile))

我想知道是否可以在 sum 函数中加入一些条件以获得类似的东西:

n_lines=sum(1 for line in open(PATHDIFF) if line=='\n' break if line.startswith('#') continue)

提前谢谢你。

最佳答案

您可以,但有一定的限制。您正在将一个生成器表达式作为参数传递给 sum,并且生成器表达式可以采用带有 if 子句的一个表达式。您可以这样组合您的条件:

n_lines=sum(1 for line in open(PATHDIFF)
if line != '\n' and not line.startswith('#'))

但是,这不会在您点击换行符 时缩短文件的迭代;它继续通读文件直到结束。为避免这种情况,您可以使用 itertools.takewhile,它只会从生成器表达式生成的迭代器中读取,直到您读取换行符。

from itertools import takewhile
n_lines = sum(1 for line in takewhile(lambda x: x != '\n',
open(PATHDIFF))
if not line.startswith('#'))

您也可以使用itertools.ifilterfalse来填充与生成器表达式的条件子句相同的作用。

from itertools import takewhile, ifilterfalse
n_lines = sum(1 for line in ifilterfalse(lambda x: x.startswith('#'),
takewhile(lambda x: x != '\n',
open(PATHDIFF))))

当然,现在您的代码开始看起来像是用 Scheme 或 Lisp 编写的。生成器表达式更容易阅读,但是 itertool 模块对于构建修改后的迭代器很有用,您可以作为不同的对象传递。


在另一个主题上,您应该始终确保关闭所有打开的文件,这意味着不要在迭代器中使用匿名文件句柄。最简洁的方法是使用 with 语句:

with open(PATHDIFF) as f:
n_lines = sum(1 for line in f if line != '\n' and not line.startswith('#'))

其他例子可以做类似的修改;只需将 open(PATHDIFF) 替换为 f 即可。

关于python - 计算条件行数的优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30484287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com