python - 将列表项转换为 int 并将它们相加的最有效方法

标签 python file-io io

我正在做这样的事情来总结一行的一些元素:

for line in open(filename, 'r'):
   big_list = line.strip().split(delim)
   a = sum(int(float(item)) for item in big_list[start:end] if item)  
   # do some other stuff

这是用一个大文件逐行完成的,其中一些项目可能会丢失,即等于''。如果我使用上面的语句来计算 a,脚本会比没有它慢得多。有没有办法加快速度?

最佳答案

这没有经过测试,但凭直觉我希望跳过中间 float 转换会有所帮助。你想获取小数点左边的整数,所以我会尝试通过正则表达式直接这样做:

import re

pattern = re.compile("\d+")

然后用正则表达式匹配替换浮点解析:

sum(int(pattern.search(item).group(0)) for item in big_list[start:end] if item)

如果您不需要保留旧的十进制字符串,您还可以在构建 big_list 时即时获取这些字符串。例如,假设我们有行 "6.0,,1.2,3.0,"。我们可以得到这样的匹配:

delim = ","
pattern = re.compile("(\d+)\.\d+|" + re.escape(delim) + re.escape(delim) + "|$")

该模式的结果为:['6', '', '1', '3', ''],然后可以像往常一样对其进行切片和过滤无需浮点解析:

for line in open(filename, 'r'):
    big_list = pattern.findall(line)
    a = sum(int(item) for item in big_list[start:end] if item)

关于python - 将列表项转换为 int 并将它们相加的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25388796/

相关文章:

java - 使用本地主机上的套接字发送消息

python - 与命令行程序交互

python - 无法在基于 CentOS 的 VPS 上构建 uwsgi

python - 读取 csv 并检查文件中的术语

c++ - 在不关闭程序的情况下写入文件后从文件中获取保存的数据

java - 是否可以在 Spring Boot 中读取响应的正文?

Java保存配置文件,多操作系统

python - 如何使用 Celery 从 Python 代码动态添加/停止 worker

python - 如何检查python脚本是否启动?

java - 不使用扫描仪将文本数据存储到java数组中