如何使用 lambda 计算文件中的单词数?
How can I use lambda to count the number of words in a file?
我正在尝试以非常规的方式使用 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
是对 iterable 的一个非常简洁的缩减操作,它消除了令人分心的累加器业务):
>>> with open("foo.py") as f:
... sum(len(x.split()) for x in f.readlines())
...
1530
最好使用 with
上下文管理器,以便您的资源自动关闭。在所有运算符周围使用空格,以便代码可读。
至于让 functools.reduce
工作:它接受一个 lambda,它接受累加器作为它的第一个参数,当前元素作为第二个参数。 functools.reduce
的第二个参数是可迭代的,第三个参数初始化累加器。完成后将其留空将其设置为可迭代项中第一项的值——可能不是您想要的值,因为我们的想法是使用累加器执行数值求和。
你可以使用
>>> with open("foo.py") as f:
... ft.reduce(lambda acc, line: len(line.split()) + acc, f.readlines(), 0)
...
1530
但这让我觉得这是一种相当 Rube Goldbergian 的解决问题的方法。
我正在尝试以非常规的方式使用 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
是对 iterable 的一个非常简洁的缩减操作,它消除了令人分心的累加器业务):
>>> with open("foo.py") as f:
... sum(len(x.split()) for x in f.readlines())
...
1530
最好使用 with
上下文管理器,以便您的资源自动关闭。在所有运算符周围使用空格,以便代码可读。
至于让 functools.reduce
工作:它接受一个 lambda,它接受累加器作为它的第一个参数,当前元素作为第二个参数。 functools.reduce
的第二个参数是可迭代的,第三个参数初始化累加器。完成后将其留空将其设置为可迭代项中第一项的值——可能不是您想要的值,因为我们的想法是使用累加器执行数值求和。
你可以使用
>>> with open("foo.py") as f:
... ft.reduce(lambda acc, line: len(line.split()) + acc, f.readlines(), 0)
...
1530
但这让我觉得这是一种相当 Rube Goldbergian 的解决问题的方法。