使用reduce()获得字符串中每个字符对/三元组的频率?

问题描述 投票:0回答:1

我应该以一种功能性的方式完成此任务,因此不会发生任何形式的循环。

我已经完成了查找单个字符的频率的任务。我的代码如下:

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)

其中文本是由许多字符组成的长字符串。 char_freq是一本字典,其键是字符,其值是其在文本中的出现频率。

但是,我不确定在不首先使用迭代的情况下如何使字符加倍或加倍。例如,如果我的文字是“我是吉米”,则双精度字应为:

“ I”,

“ am”,

“ J',

“ im”,

“我的”

三元组一次是每3个字符。迭代并每2或3个字符添加到列表中,然后将其传递给reduce()将足够简单。但是由于我无法进行迭代,因此在执行此操作方面我有些茫然。

我对python很陌生,对函数式编程也很陌生,所以如果答案很简单,我深表歉意。此外,如果有完全不同的方法可以做到这一点,则将不胜感激!

python dictionary functional-programming mapreduce reduce
1个回答
0
投票

这里是一个辅助函数,用于按顺序生成所有n大小的分组。

def generate_n(seq, n, i, acc):
    if i >= len(seq):
        return acc
    else:
        acc.append(seq[i:i+n])
        return generate_n(seq, n, i + n, acc)

注意,它不是纯粹的功能,因为我使用了.append,但是如果没有它,则必须使用列表串联,这在这里效率很低...一般来说,Python并没有提供很多有效的方法与典型的纯函数式编程构造一起使用的结构。但是要“纯功能性”,您可以使用:

def generate_n(seq, n, i, acc):
    if i >= len(seq):
        return acc
    else:
        return generate_n(seq, n, i + n, acc + [seq[i:i+n]])

注意,Python不会优化尾递归,因此此解决方案受堆栈大小的限制(深度超过1000时将变得晦涩难懂)。但这可以做一个练习(您将never在生产Python中编写这样的代码)。

© www.soinside.com 2019 - 2024. All rights reserved.