zoukankan      html  css  js  c++  java
  • Python面试题 —— 计算列表中出现最多次的字符

    给你一个其中包含不同的英文字母和标点符号的文本,你要找到其中出现最多的字母,返回的字母必须是小写形式, 当检查最想要的字母时,不区分大小写,所以在你的搜索中 "A" == "a"。 请确保你不计算标点符号,数字和空格,只计算字母。

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

    输入: 用于分析的文本 (str, unicode).

    输出: 最常见的字母的小写形式。

    范例:

    1 get_max_value("Hello World!") == "l"
    2 get_max_value("How do you do?") == "o"
    3 get_max_value("One") == "e"
    4 get_max_value("Oops!") == "o"
    5 get_max_value("AAaooo!!!!") == "a"
    6 get_max_value("abe") == "a"

    如何使用: 对于大多数的解密任务,你需要知道各种字母出现在一段文字的频率。例如:如果我们知道在哪个字母出现的频率,我们可以很容易地破解一个简单的加法密码或替换密码。这是语言专家有趣的事情!

    前提:密码只包含ASCII码符号 0 < len(text) ≤ 105

    普通方法:

    利用collections工具中的Counter,对列表中元素出现频率进行排序。Counter返回值是一个按元素出现频率降序排列的Counter对象,它是字典的子类,因此可以使用字典的方法。

     1 import re
     2 from collections import Counter
     3 
     4 def get_max_value(text):
     5     text = text.lower()
     6     result = re.findall('[a-zA-Z]', text)  # 去掉列表中的符号符
     7     count = Counter(result)  # Counter({'l': 3, 'o': 2, 'd': 1, 'h': 1, 'r': 1, 'e': 1, 'w': 1})
     8     count_list = list(count.values())
     9     max_value = max(count_list)
    10     max_list = []
    11     for k, v in count.items():
    12         if v == max_value:
    13             max_list.append(k)
    14     max_list = sorted(max_list)
    15     return max_list[0]

    精简方法:

    同样是使用Counter,但是通过列表推导式,可以使函数更加精炼。这就是列表推导式的好处。

    1 from collections import Counter
    2 3 def get_max_value(text):
    4     count = Counter([x for x in text.lower() if x.isalpha()])
    5     m = max(count.values())
    6     return sorted([x for (x, y) in count.items() if y == m])[0]

    最佳方法:

    不得不称赞这种方法,实在是干脆利落。它巧妙的使用了max()函数。

    1 import string
    2 
    3 def get_max_value(text):
    4     text = text.lower()
    5     return max(string.ascii_lowercase, key=text.count)

    利用了max()函数的key参数,巧妙的将出现次数最多的字符提取出来。

    1 max(arg1, arg2, *args, *[, key=func]) -> value

    我来为大家解释一下max(string.ascii_lowercase, key=text.count)这句代码的原理。

    string.ascii_lowercase 等价于 'abcdefghijklmnopqrstuvwxyz' 而max()函数key参数的作用是:筛选符合key函数的返回值的最大值,如果有多个符合条件的值,则选取第一个。

    max(range(6), key = lambda x : x>2)
    >>> 3
    # 带入key函数中,各个元素返回布尔值,相当于[False, False, False, True, True, True]
    # key函数要求返回值为True,有多个符合的值,则挑选第一个。
    
    max([3,5,2,1,4,3,0], key = lambda x : x)
    >>> 5
    # 带入key函数中,各个元素返回自身的值,最大的值为5,返回5.
    
    max('ah', 'bf', key=lambda x: x[1])
    >>> 'ah'
    # 带入key函数,各个字符串返回最后一个字符,其中'ah'的h要大于'bf'中的f,因此返回'ah'
    
    max('ah', 'bf', key=lambda x: x[0])
    >>> 'bf'
    # 带入key函数,各个字符串返回第一个字符,其中'bf'的b要大于'ah'中的a,因此返回'bf'
    
    max('abcdefghijklmnopqrstuvwxyz', key=text.count) # text = 'Hello World'
    >>> 'l'
    # 带入key函数,返回各个字符在'Hello World'中出现的次数,出现次数最多的字符为'l',因此输出'l'

    这样大家就理解为什么通过max()函数的key参数就可以求得出现次数最多,且符合字母表排序的字符了吧!让我们再一次为写出该函数作者的脑洞点赞!

  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/Lands-ljk/p/5764003.html
Copyright © 2011-2022 走看看