【发布时间】:2020-06-26 10:37:43
【问题描述】:
我知道如何在不使用 lambda/map 的情况下解决我的问题(而且我不能在这个练习中使用正则表达式或其他 python 库),使用带有 string.replace() 的 for 循环......但我是真的想看看我是否可以使用 map/lambda 和 string.replace 的组合来获得相同的结果\
我的目标是读入一个 txt 文件,然后用字母“e”替换非标准“e”(如 éêèÉÊÈ)的每个实例
我现在的主要问题是我得到了 6 个列表(例如,我在 newFile / newFileListComprehension 中有 6 个字符串,并且每个字符串都已更新原始字符串,基于评估的 1 个可迭代对象
例如newFile[0] = .replace('é') 的输出,newFile[1] = .replace(' 的输出ê') 等等
所以我想要的是返回 1 个格式化字符串的副本,所有的 .replace() 都对其进行迭代。
我在下面引用的文本文件的链接可以访问https://easyupload.io/s7m0zj
import string
def file2str(filename):
with open(filename, 'r', encoding="utf8") as fid:
return fid.read()
def count_letter_e(filename, ignore_accents, ignore_case):
eSToAvoid = 'éêèÉÊÈ'
textFile = file2str("Sentence One.txt")
newFileListComprehension = [textFile.replace(e,'e') for e in eSToAvoid if ignore_accents == 1]
value = textFile.count('e')
#newFile = list((map(lambda element: (textFile.replace(element, 'e') if ignore_accents == 1 else textFile.count('e')), eSToAvoid)))
return 0
numberOfEs = count_letter_e("Sentence One.txt", 1, 1)```
【问题讨论】:
-
列表理解很容易从您的代码行中适应。这就是你想要的吗?
-
老实说,JF,我尝试使用列表理解,但似乎效果更差......而且我认为列表理解会更加困难,因为它本质上将为“每个" 列表中的值....但也许我弄错了?
-
"我认为列表理解会更困难,因为它本质上会为列表中的“每个”值创建一个可迭代的列表。”我不知道这意味着什么,但列表推导本质上是一种方便的方式来编写生成列表的
map/filter操作。 -
无论如何,你可以提供一个例子,这种模糊的描述通常不会被接受。请注意,数据来自文本文件这一事实并不真正相关。只需提供输入和预期输出,以及您已经使用过的代码。请注意,仅通过阅读您的描述,听起来
map并不是正确的解决方案。 听起来应该是reduce。但实际上,在 Python 中,您只需编写一个 for 循环。即使是map/filter通常也会在适当的地方避免使用。 -
当然,juanpa,我更新了我对这个问题的列表理解的“尝试”....我试过了,但被卡住了或多或少与 map/reduce 相同的结果