如何从字母选择中返回字母表中最早的字母?

时间:2014-03-10 20:12:01

标签: python string python-3.x

我正在做一个练习,要求我用一串字母返回最常用的字母。如果有两个字母以相同的频率出现,则“决胜局”将以字母表中的第一个出现。例如:

'aaaabbbb' #should return a.

我的回复信的代码如下。我认识到它可能不是最有效的。我稍后会担心的。

def mostWantedLetter(text):
    text = text.lower()
    mwl = {}
    for letter in text:
        if letter not in mwl:
            mwl[letter] = 1
        else:
            mwl[letter] += 1

    for letter in sorted(mwl, key = mwl.get, reverse = True):
        if letter.isalpha():
            #letter = sorted(list(letter))
            return letter      #[0]

感谢Stack Overflow社区帮助我实现这一目标!

4 个答案:

答案 0 :(得分:4)

祝贺到目前为止。我会提供两个提示:

提示1:将key参数修改为sorted(),以考虑字母的数量及其在字母表中的位置。

提示2:了解Python如何比较元组。

另请注意,collections.Countercollections.defaultdict值得了解。

答案 1 :(得分:3)

是的,我发现了这一点,非常酷:

>>> import collections
>>>
>>> ordered1 = collections.Counter('aaaabbbb').most_common(1))
>>> ordered1[0][0]
'a'
>>>
>>> ordered2 = collections.Counter('abb').most_common(1))
>>> ordered2[0][0]
'b'

这会使字母按顺序排列,然后如果两个字母出现相等的次数,则按字母顺序排序。

答案 2 :(得分:1)

def mostWantedLetter(text):
    # count how many times each letter occurs
    mwl = {}
    for ch in text.lower():
        if ch.isalpha():
            mwl[ch] = mwl.get(ch, 0) + 1

    # ordered descending by count (highest first) then ascending by letter
    least = min(mwl.items(), key=lambda x:(-x[1], x[0]))

    # return the letter from the least item
    return least[0]

答案 3 :(得分:0)

def most_wanted(s):
    return chr(min(set([ord(x) for x in list(s)])))

它将字符串分解为一个列表,然后将它们全部转换为它们的ascii表示。它使这成为一个集合,因此不需要比较重复项。它从这些中获取最小值,然后将其转换回字母。