checkio练习题:002-most-wanted-letter

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ch_xin/article/details/88286772

给你一段文本,其中包含不同的英文字母和标点符号。 
你要找到其中那个出现最多的 字母,返回的字母必须是 小写形式。 
找这个“头号通缉字母”时,大小写不重要,所以对于你的搜索而言 "A" == "a"。 注意不要管标点符号、数字和空格,我们只要 字母!

如果你找到 两个或两个以上出现频率相同的字母, 那么返回字母表中靠前的那个。 
例如“one”包含“o”、“n”、“e”每个字母一次,因此我们选择“e”。

输入: 包含待分析文本的字符串

输出: 那个出现最多的字母的字符串(小写哦)

范例:
checkio("Hello World!") == "l"
checkio("How do you do?") == "o"
checkio("One") == "e"
checkio("Oops!") == "o"
checkio("AAaooo!!!!") == "a"
checkio("abe") == "a"

有何功用: 大多数的解密任务都需要搞清一段文本中各种字符的出现频率。
例如,有了字母的出现频率,我们就可以轻易地破解一个简单的移位密码或替换式密码了。语言专家们对此总是乐此不疲!

前提:: 
输入的文本 text 只包含 ASCII 码字符 
0 < len(text) ≤ 10 5

from collections import *
import re

def checkio(text) -> str:
    # 过滤标点符、数字、空格
    text = re.sub("[0-9\s+`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?%+_-]", "", text)
    # 转成全小写格式并增加空格分隔
    text = ' '.join(text.lower())
    # 通过空格分割为列表
    li = text.split(' ')
    # 使用Counter计数
    res = dict(Counter(li))
    print(res)
    # 根据key值排序
    res = dict(sorted(res.items(), key=lambda res: res[0], reverse=False))
    print(res)
    # 然后取value最大值
    return max(res, key=res.get)


if __name__ == '__main__':
    print("Example:")
    print(checkio("Hello World!"))

    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert checkio("Hello World!") == "l", "Hello test"
    assert checkio("How do you do?") == "o", "O is most wanted"
    assert checkio("One") == "e", "All letter only once."
    assert checkio("Oops!") == "o", "Don't forget about lower case."
    assert checkio("AAaooo!!!!") == "a", "Only letters."
    assert checkio("abe") == "a", "The First."
    assert checkio("Lorem ipsum dolor sit amet") == 'm', "The First."
    assert checkio("a-z") == 'a', "symbol not."
    print("Start the long test")
    assert checkio("a" * 9000 + "b" * 1000) == "a", "Long."
    print("The local tests are done.")

"""
# 用sorted函数的key= 参数排序: 
# 按照key进行排序 
print sorted(dict1.items(), key=lambda dict1: dict1[0]) 
# 按照value进行排序 
print sorted(dict1.items(), key=lambda dict1: dict1[1]) 

sum(c.values())  # 所有计数的总数
c.clear()  # 重置Counter对象,注意不是删除
list(c)  # 将c中的键转为列表
set(c)  # 将c中的键转为set
dict(c)  # 将c中的键值对转为字典
c.items()  # 转为(elem, cnt)格式的列表
Counter(dict(list_of_pairs))  # 从(elem, cnt)格式的列表转换为Counter类对象
c.most_common()[:-n:-1]  # 取出计数最少的n-1个元素
c += Counter()  # 移除0和负值
"""

猜你喜欢

转载自blog.csdn.net/ch_xin/article/details/88286772
今日推荐