1.字典
1.1排序
在Python中,要按照字典的值进行排序,可以按照以下步骤操作:
方法说明
- 获取键值对列表:使用
dict.items()
获取字典的键值对视图。 - 排序键值对:使用
sorted()
函数,并通过key
参数指定按值排序。 - 转换回字典(可选):将排序后的列表转换为字典(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]
-
collections.Counter(arr)
统计arr
中每个元素的出现次数,返回Counter
对象(字典子类,键为元素,值为频率)38。- 例如:
arr = [1, 2, 2, 3]
→group = {1:1, 2:2, 3:1}
。
- 例如:
-
most_common()
返回元素及其频率的列表,按频率 从高到低 排序。若参数为空(如most_common()
),返回所有元素23。- 示例结果:
[('b', 3), ('a', 2), ('c', 1)]
。
- 示例结果:
-
[::-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