python - 如何使用 lambda 计算文件中的单词数?
问题描述
reduce
我正在尝试使用, lambda
&readlines
以非常规的方式计算文件中的字数:
import functools as ft
f=open("test_file.txt")
words=ft.reduce(lambda a,b:(len(a.split())+len(b.split())),f.readlines())
print(words)
当我尝试拆分整数(索引)时,这会引发属性错误。我如何获得此代码来拆分由返回的可迭代元素f.readlines()
并连续添加它们的长度(即,这些行中的单词数)以最终计算文件中的单词总数?
解决方案
如果您正在尝试获取文件中的字数,f.read()
则比f.readlines()
因为它消除了逐行求和的需要更有意义。您将整个文件放在一个块中,然后可以使用split
不带参数的空格分割。
>>> with open("foo.py") as f:
... len(f.read().split())
...
1530
如果您真的想使用,则无论如何都readlines
更容易避免行的长度(这是对可迭代的非常简洁的归约操作,它消除了令人分心的累加器业务):functools.reduce
sum
split
sum
>>> with open("foo.py") as f:
... sum(len(x.split()) for x in f.readlines())
...
1530
使用with
上下文管理器是一种很好的做法,这样您的资源就会自动关闭。在所有运算符周围使用空格,以便代码可读。
至于functools.reduce
开始工作:它接受一个 lambda,它接受累加器作为其第一个参数,当前元素作为第二个参数。to的第二个参数functools.reduce
是一个可迭代的,第三个参数初始化累加器。将其留空,将其设置为可迭代项中第一项的值 - 可能不是您想要的,因为这个想法是使用累加器执行数值求和。
您可以使用
>>> with open("foo.py") as f:
... ft.reduce(lambda acc, line: len(line.split()) + acc, f.readlines(), 0)
...
1530
但这让我觉得这是一种相当鲁布戈德堡式的解决问题的方法。
推荐阅读
- c# - .NET - 从控制台与工作人员交互的正确方法是什么?
- chef-infra - 没有属性时的 load_current_value
- reactjs - useQuery 中的 Apollo 状态变量
- php - 尝试使用 MINI PHP MVC 制作搜索栏
- python - 使用 Python 评估包含命名空间的 xml 的 xpath
- php - PHP:无法在我的对象数组中进入我的回调函数
- sql - Hive SQL 将字符串转换为时间戳而不丢失毫秒
- pandas - 寻找在两个熊猫列之间获取 pearsonr 的有效方法
- spring-data-gemfire - 通过方法'sessionRegion'表达的Spring Boot Geode不满足的依赖关系
- html - 浏览器添加额外的结束标签