如何计算字符串中最常见的字母?

时间:2017-11-12 17:45:15

标签: python

class MyString:
    def __init__(self, myString):
        self.__myString = myString

    def countWord(self):
         count = len(self.__myString.split())
         return count

    def findMostFrequentChar(self):
        # ?

我需要实施findMostFrequenctChar。她给我们的唯一暗示是我们需要制作2个名单。这就是她失去了我的地方。

这是调用函数的代码:

def main():
    aString = MyString("This is a super long long long string. Please help count me")
    print("There are", aString.countWord(), "words in the string.")

    count, letter = aString.findMostFrequentChar()
    print("The most frequent character is", letter, "which appeared", count, "times")

main()

6 个答案:

答案 0 :(得分:4)

  

她给我们的唯一暗示是我们需要制作2个名单。这就是她失去了我的地方。

这似乎意味着您无法使用collections.Counter, 甚至可能不是字典。

如果我们可以假设字母被定义为英文字母, 那么一个清单就足够了。 在这种情况下,您可以创建一个包含26个项目的列表,所有项目都初始化为0。 然后你可以迭代字符串的字符, 对于英文字母的每个字母,增加列表中n项的计数,其中n是字母表中字母的索引。

创建26个零的列表:

counts = [0] * 26

循环输入字符串s的字符:

for c in s:

检查字符是否为字母:

if 'a' <= c.lower() <= 'z'

计算字母表中字母的从0开始的索引并递增计数:

index = ord(c.lower()) - ord('a')
counts[index] += 1

一旦你有了计数, 你可以找到具有最大值的索引(作为练习留给你), 并使用chr(index + ord('a'))获取相应的字符。

答案 1 :(得分:3)

您可以使用sorted

class String:
    def __init__(self, s):   
       self.s = s
    def findMostFrequentChar(self):
       return sorted([(a, self.s.count(a)) for a in self.s], key=lambda x:x[-1])[-1]

答案 2 :(得分:2)

如果您可以使用Counter模块中的collections

from collections import Counter

def findMostFrequentChar(self):
    d = Counter(self.__myString.replace(' ', '').lower())        
    return d.most_common()[0]

如果Counter无法解决问题:

def findMostFrequentChar(self):
    d = {}

    for ch in self.__myString.replace(' ', '').lower():
        if ch in d:
            d[ch] += 1
        else:
            d[ch] = 1

    most_frequent = max(d, key=d.get)
    return most_frequent, d[most_frequent]

完全放弃:

class MyString:
    def __init__(self, myString):
        self.__myString = myString

    def countWord(self):
         count = len(self.__myString.split())
         return count

    def findMostFrequentChar(self):        
        d = {}

        for ch in self.__myString.replace(' ', '').lower():
            if ch in d:
                d[ch] += 1
            else:
                d[ch] = 1
        most_frequent = max(d, key=d.get)
        return most_frequent, d[most_frequent]


def main():    
    aString = MyString("This is a super long long long string. Please help count me")
    print("There are", aString.countWord(), "words in the string.")

    letter, count = aString.findMostFrequentChar()
    print("The most frequent character is", letter, "which appeared", count, "times")

main()

答案 3 :(得分:1)

我将向您展示如何使用不带任何导入的字典来获取常规字符串的最常用字母。你的工作就是相应地调整你的课程。

我假设如果两个或多个字母共享最高频率,则其中任何一个都是有效结果。

>>> s = 'aabacbcd'
>>> counts = {}
>>> for c in s:
...     counts[c] = counts.get(c, 0) + 1
... 
>>> counts
{'a': 3, 'c': 2, 'b': 2, 'd': 1}
>>> max(counts, key=counts.get)
'a'

答案 4 :(得分:1)

我会使用dict存储计数。 但首先我要删除所有spaces和其他符号,然后a-z,我也想计算上限和下限。小写字母为同一个字母。

当使用我的所有值构造dict时,我使用max函数。 max采用可迭代的方式,因此我们将dict作为元组(key, val)的“列表”传递。我们需要告诉max如何确定我们想要比较的内容,因为我们给出了一个lambda函数,它将元组中的第二个元素(val)带到key-arg

作为回报,max会以最高val吐出元组。

class MyString:

    def __init__(self, myString):
        self.__myString = myString

    def countWord(self):
        count = len(self.__myString.split())
        return count

    def findMostFrequentChar(self):
        counter = {}
        # Instead of performing various modifications on the string
        # one can instead filter all the undesired chars.
        # new_string = self.__myString.replace(' ', '').lower()
        new_string = list(filter(lambda x: 'a' >= x <= 'z', self.__myString.lower()))
        for char in new_string:

            if char in counter:
                counter[char] += 1
            else:
                counter[char] = 1

        key, value = max(counter.items(), key=lambda x:x[1])
        return value, key


def main():
    aString = MyString("This is a super long long long string. Please help count me")
    print("There are", aString.countWord(), "words in the string.")

    count, letter = aString.findMostFrequentChar()
    print("The most frequent character is", letter, "which appeared", count, "times")

main()

答案 5 :(得分:0)

“两个清单”部分令人生气。但是,计算Python中可迭代元素的一个实用工具是collections.Counter

from collections import Counter

# ...
    def findMostFrequentChar(self):
        return Counter(self.__myString).most_common()[0][0]