【问题标题】:How can I use lambda to count the number of words in a file?如何使用 lambda 计算文件中的单词数?
【发布时间】:2020-04-08 22:15:20
【问题描述】:

我正在尝试以非常规的方式使用reducelambdareadlines 计算文件中的字数:

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() 返回的可迭代元素并连续添加它们的长度(即这些行中的单词数)以最终计算文件中的总单词数?

【问题讨论】:

  • 也许阅读文档。然后写lambda a,b:a+len(b.split())并在最后添加一个初始化器,0

标签: python python-3.x file lambda functools


【解决方案1】:

如果您尝试获取文件中的字数,f.read()f.readlines() 更有意义,因为它无需逐行求和。您将整个文件放在一个块中,然后可以使用 split 不带参数地在空白处拆分。

>>> with open("foo.py") as f:
...     len(f.read().split())
...
1530

如果你真的想使用readlines,在任何情况下都更容易避免functools.reducesum split 行的长度(sum 是一个非常简洁的可迭代的归约操作摆脱令人分心的累加器业务):

>>> 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

但这让我觉得这是一种相当鲁布·戈德堡式的解决问题的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多