练习-字典按值排序

需求

最近在看工作机会, 然后做了一道华为外包的笔试题.

1. 输入:  "eaaabbccccddderrfc"
2. 要求:
    ​    2.1 按字母出现次数降序排列输出, 如果次数相同,则按自然顺序排序
    ​    2.2 不能用Python 内置的排序函数
    输出:  c:5;a:3;d:3;b:2;e:2;r:2;f:1;

我咋眼一看, 这种送分题, 能难住我?

  • 构造一个字典, 统计词频
  • sorted() 按值排序即可

求解

用内置函数sorted()

my_str =  "eaaabbccccddderrfc"

# 统计词频
d = {}
for s in my_str:
    if d.get(s):
        d[s] += 1
    else:
        d[s] = 1
        
# 字典按值排序, sorted()
sorted(d.items(), key=lambda arr: arr[1], reverse=True)
[('c', 5), ('a', 3), ('d', 3), ('e', 2), ('b', 2), ('r', 2), ('f', 1)]

正准备提交, 才发现, 不能用内置, 要自己写排序, 这一下, 难度立马升级了

  • 短时间内要写出排序算法
  • 数据要如何组织

本来想写个快排, 结果那一刻, 竟然写不出来, 果然平时练习和真正测试,不刷题真的搞不定, 还好会写个冒泡, 差点就凉凉了.

'''
1. 输入:  "eaaabbccccddderrfc"
2. 要求:
    ​    2.1 按字母出现次数降序排列输出, 如果次数相同,则按自然顺序排序
    ​    2.2 不能用Python 内置的排序函数
    输出:  c:5;a:3;d:3;b:2;e:2;r:2;f:1;
'''

# 词频统计
def word_count(my_str):
    """输入一个字符串, 统计每个字母的频率"""
    d = {}
    for s in my_str:
        if d.get(s):
            d[s] += 1
        else:
            d[s] = 1
    return d


def my_sort(lst):
    """输入一个数组, 按降序排列"""
    n = len(lst)
    if n == 1:
        return lst
    for i in range(n):
        for j in range(n - 1 - i):
            if lst[j] < lst[j + 1]:
                # 交换顺序
                lst[j], lst[j + 1] = lst[j + 1], lst[j]
    return lst


if __name__ == '__main__':
    
    my_str = "eaaabbccccddderrfc"
    d = word_count(my_str)
    desc_keys = my_sort(list(d.values()))
    lst_ret = []
    for i in desc_keys:
        for k, v in d.items():
            if i == v:
                lst_ret.append((k, v))
                d.pop(k)
                break
    # 输出效果
    for s in lst_ret:
        print(f"{s[0]}:{s[1]}", end=";")
c:5;a:3;d:3;e:2;b:2;r:2;f:1;

平时多积累, 唯手熟尔呀, 不过好像还是没有做到按自然顺序排列哦.

posted @ 2019-11-19 23:46  致于数据科学家的小陈  阅读(209)  评论(0编辑  收藏  举报