【发布时间】:2020-08-23 07:00:01
【问题描述】:
我应该以一种功能性的方式完成这项任务,所以没有任何形式的循环。
我已经完成了寻找单个字符频率的任务。我的代码如下所示:
char_freq = {}
def getcharfreq(char_freq, ch):
char_freq[ch] = char_freq.get(ch, 0) + 1
return char_freq
# Get the frequencies of each character in the text
functools.reduce(getcharfreq, text, char_freq)
其中 text 是由许多字符组成的长字符串。 char_freq 是一个字典,键是字符,值是它在文本中的频率。
但是,我不确定如何在不先使用迭代的情况下获得字符双倍或三倍。例如,如果我的文本是“我是 Jimmy”,则双精度为:
“我”,
“我”,
"J',
“我”,
“我的”
三元组一次是每 3 个字符。迭代并将每 2 或 3 个字符添加到列表中,然后将其传递给 reduce() 将非常简单。但是由于我无法迭代,所以我对如何做到这一点有些茫然。
总的来说,我对 python 很陌生,对函数式编程的概念也很陌生,所以如果答案很简单,我深表歉意。此外,如果有完全不同的方法可以做到这一点,我们将不胜感激!
【问题讨论】:
-
getcharfreq在函数式编程意义上并不是真正的“函数式”,它纯粹是为了副作用。 -
@juanpa.arrivillaga 我明白你的意思 - 我只知道如果我使用任何显式循环,我会受到严重惩罚,所以我正在努力寻找解决方法。
-
那么您的约束究竟是什么?您必须使用
reduce?无论如何,函数式编程中迭代循环的最通用替代方法是 recursion,这将是您可能必须生成所有单、对和三元组的方式 -
@juanpa.arrivillaga 我想reduce不是明确要求的,只是提到了:“使用map/reduce”。如果我在没有迭代的情况下这样做,我相信它会很好。递归,我明白了。我没想到。
标签: python dictionary functional-programming mapreduce reduce