我正在做一个练习,要求我用一串字母返回最常用的字母。如果有两个字母以相同的频率出现,则“决胜局”将以字母表中的第一个出现。例如:
'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社区帮助我实现这一目标!
答案 0 :(得分:4)
祝贺到目前为止。我会提供两个提示:
提示1:将key
参数修改为sorted()
,以考虑字母的数量及其在字母表中的位置。
提示2:了解Python如何比较元组。
另请注意,collections.Counter
和collections.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表示。它使这成为一个集合,因此不需要比较重复项。它从这些中获取最小值,然后将其转换回字母。