簡體   English   中英

如何使用 lambda 計算文件中的字數?

[英]How can I use lambda to count the number of words in a file?

我正在嘗試以非常規的方式使用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()返回的可迭代元素並連續添加它們的長度(即這些行中的單詞數)以最終計算文件中的單詞總數?

如果您嘗試獲取文件中的字數, f.read()f.readlines()更有意義,因為它無需逐行求和。 您將整個文件放在一個塊中,然后可以在沒有 arguments 的情況下使用split分割空白。

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

如果你真的想使用readlines ,在任何情況下都更容易避免使用functools.reduce並對split線的長度sumsum是一個非常簡潔的對可迭代的歸約操作,它消除了令人分心的累加器業務):

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

但這讓我覺得這是解決問題的一種相當魯布·戈德堡式的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM