当前位置: 首页 > news >正文

编程题python常用技巧-持续

1.字典

1.1排序 

在Python中,要按照字典的值进行排序,可以按照以下步骤操作:

方法说明

  1. 获取键值对列表‌:使用 dict.items() 获取字典的键值对视图。
  2. 排序键值对‌:使用 sorted() 函数,并通过 key 参数指定按值排序。
  3. 转换回字典(可选)‌:将排序后的列表转换为字典(Python 3.7+ 支持有序字典)。

 

# 原始字典
d = {'apple': 10, 'banana': 5, 'orange': 20}# 按值升序排序键值对
sorted_items = sorted(d.items(), key=lambda x: x[1])# 输出排序后的列表
print("按值升序排列的列表:", sorted_items)
# 输出: [('banana', 5), ('apple', 10), ('orange', 20)]# 转换为有序字典(Python 3.7+)
sorted_dict = dict(sorted_items)
print("排序后的字典:", sorted_dict)
# 输出: {'banana': 5, 'apple': 10, 'orange': 20}# 按值降序排序(添加 reverse=True)
sorted_items_desc = sorted(d.items(), key=lambda x: x[1], reverse=True)
print("按值降序排列的列表:", sorted_items_desc)
# 输出: [('orange', 20), ('apple', 10), ('banana', 5)]

 

 1.2统计字典的 key个数 collections.Counter(arr)

代码实现了对数组 arr 中元素的频率统计,并按出现次数 ‌从低到高‌ 排序。以下是代码解析及优化建议:

group = collections.Counter(arr) freq = group.most_common()[::-1]

  1. collections.Counter(arr)
    统计 arr 中每个元素的出现次数,返回 Counter 对象(字典子类,键为元素,值为频率)38。

    • 例如:arr = [1, 2, 2, 3] → group = {1:1, 2:2, 3:1}
  2. most_common()
    返回元素及其频率的列表,按频率 ‌从高到低‌ 排序。若参数为空(如 most_common()),返回所有元素23。

    • 示例结果:[('b', 3), ('a', 2), ('c', 1)]
  3. [::-1]
    通过切片反转列表,实现 ‌从低到高‌ 排序56。

    • 最终结果:[('c', 1), ('a', 2), ('b', 3)]

潜在问题与改进

1. ‌相同频率元素的顺序不确定性

  • most_common() 对相同频率的元素会保留原始插入顺序(Python 3.7+ 字典有序),但若需严格按元素值排序,需额外处理8。
  • 改进方法‌:显式指定排序规则。
  • freq = sorted(group.items(), key=lambda x: (x[1], x[0])) # 先按频率升序,再按元素值升序

2. ‌性能优化(适用于大数据量)

  • most_common() 的时间复杂度为 O(n log n),若仅需升序结果,可直接生成排序列表:

    freq = sorted(group.items(), key=lambda x: x[1]) # 直接生成升序列表,无需反转


完整示例

from collections import Counter 
arr = [1, 2, 2, 3, 3, 3] 
group = Counter(arr) # 原始方法:反转列表 
freq_reversed = group.most_common()[::-1] 
# 输出:[(1, 1), (2, 2), (3, 3)] 
# 改进方法:显式排序 
freq_sorted = sorted(group.items(), key=lambda x: x[1]) # 输出:[(1, 1), (2, 2), (3, 3)]

方法对比

方法时间复杂度相同频率元素的处理适用场景
most_common()[::-1]O(n log n)保留插入顺序快速实现,无需严格排序
sorted()O(n log n)可自定义排序规则(如元素值)需明确控制排序逻辑

注意事项

  • 空数组处理‌:若 arr 为空,group 也为空,freq 会得到空列表,需在后续逻辑中处理5。
  • 频率为0的元素‌:Counter 默认不包含未出现的元素,但可通过 elements() 遍历所有可能键
    def findLeastNumOfUniqueInts2(self, arr: list, k: int) -> int:group = collections.Counter(arr) # Counter({5: 2, 4: 1})print(group)freq=group.most_common()[::-1] # 逆序[(4, 1), (5, 2)]print(freq)ans=len(freq)for _ ,occ in freq:if k>=occ:ans-=-1k-=occelse:breakreturn ansprint(s.findLeastNumOfUniqueInts2([5, 5, 4], 1))Counter({5: 2, 4: 1})

题目: 1481. 不同整数的最少数目 - 力扣(LeetCode)

 def findLeastNumOfUniqueInts(self, arr: List[int], k: int) -> int:arr_dict={}for i in arr:if i not in arr_dict:arr_dict[i]=1else:arr_dict[i]+=1# 对字典排序 sorted_dict=dict(sorted(arr_dict.items(),key=lambda x:x[1]))#print(sorted_dict)keys=sorted_dict.keys()ans=len(keys)for key in keys:if k-sorted_dict[key]>=0:#sorted_dict.remove(key)ans-=1k=k-sorted_dict[key]else:breakreturn ans

相关文章:

  • 第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题,选择题详细解释
  • 【笔记】深度学习模型训练的 GPU 内存优化之旅③:内存交换篇
  • 如何降低LabVIEW开发费用
  • 自动剪辑批量混剪视频过原创软件工具视频帧级处理技术实践批量截图解析
  • Leetcode刷题记录25——合并区间
  • 移动光猫 UNG853H 获取超级管理员账号密码
  • 一键解放双手,操作丝滑起飞!
  • Vue3 + OpenLayers 企业级应用进阶
  • 【浅尝Java】Java简介第一个Java程序(含JDK、JRE与JVM关系、javcdoc的使用)
  • matlab 中function的用法
  • 网络分析/
  • 22.2Linux的I2C驱动实验(编程)_csdn
  • 突破zero-RL 困境!LUFFY 如何借离线策略指引提升推理能力?
  • T575729 正经数组
  • mem0 安装与测试:一个强大的对话记忆管理工具
  • 2025五一杯数学建模C题:社交媒体平台用户分析问题,完整第一问模型与求解+代码
  • C语言 指针(2)
  • Winform(7.序列化方式整理)
  • 经济学和奥地利学派的起源
  • 【Java】HashMap
  • 美伊谈判因“后勤原因”推迟,伊朗:视美国做法再定谈判日期
  • 从“土”到“潮”,唢呐何以“圈粉”年轻人
  • 拍摄《我们这一代》的肖全开展“江浙沪叙事”
  • 陕西省副省长窦敬丽已任宁夏回族自治区党委常委、统战部部长
  • 工业富联一季度净利增长25%,云计算业务营收增长超50%
  • 国有六大行一季度合计净赚超3444亿,不良贷款余额均上升