练习-字典按值排序
需求
最近在看工作机会, 然后做了一道华为外包的笔试题.
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;
平时多积累, 唯手熟尔呀, 不过好像还是没有做到按自然顺序排列哦.
耐心和恒心, 总会获得回报的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通