Python字典按值排序:sorted与sort方法详解
本文详细介绍Python中字典按值排序的两种常用方法:使用sorted高阶函数和列表的sort()方法。通过示例解析lambda表达式在排序中的应用,强调d.items()的使用及结果赋值的必要性,并附带jieba库词频统计的实际应用场景,帮助开发者高效处理字典排序问题。
使用sorted高阶函数进行字典排序
一、使用sorted高阶函数
该方法代码简洁,是官方推荐的首选方案。
d={'a':1,'c':3,'b':2} # 首先建一个字典d
#d.items()返回的是: dict_items([('a', 1), ('c', 3), ('b', 2)])
d_order=sorted(d.items(),key=lambda x:x[1],reverse=False) # 按字典集合中,每一个元组的第二个元素排列。
# x相当于字典集合中遍历出来的一个元组。
print(d_order) # 得到: [('a', 1), ('b', 2), ('c', 3)]
以下是对sorted排序机制的详细解析:
1. sorted函数的基本语法为:sorted(可迭代对象, key=函数名, reverse=False/True)。
其核心功能是遍历可迭代对象,依据key指定的规则对元素进行排序。
可迭代对象指包含多个元素的数据结构,如集合、序列(列表、字符串、元组)以及字典等。
key参数用于定义排序依据,通常需自定义一个返回排序关键值的函数,并将该函数名赋值给key。
reverse参数控制排序方向,默认为False(升序);设为True时则执行降序排列。
2. 匿名函数lambda的标准格式为: 函数名 = lambda [形参1,形参2,...] : ,用于定义简易函数并返回操作结果。
具体示例如下:key=lambda x : x[1]
其中x代表字典项中的一个元组,例如从dict_items([('a', 1), ('c', 3), ('b', 2)])中取出的('a', 1)、('c', 3)或('b', 2)。
x[1]表示提取元组的第二个元素,即键值对中的值(如1、2或3),以此作为排序依据。
关键注意事项:
(1)对字典排序时,直接迭代字典d仅能得到键,必须使用d.items()才能获取键值对。
错误写法示例:d_order=sorted(d,key=lambda x:x[1],reverse=False),这会导致错误。
正确写法应为:d_order=sorted(d.items(),key=lambda x:x[1],reverse=False)。
(2)sorted函数返回的是排序后的列表,必须将其赋值给一个新变量,例如d_order=sorted(d.items(),key=lambda x:x[1],reverse=False)。
由于字典本身是无序数据结构,若不将排序结果绑定到新变量,原始字典的顺序不会改变且看似被“打乱”。
利用列表sort()方法间接排序
二、使用列表的sort()方法
Python字典内置无排序方法,但可借助列表的sort()方法间接实现。
操作前提是将字典转换为列表后再进行排序。
具体示例如下:
d={'a':1,'c':3,'b':2} # 首先建一个字典d
d.items() # 得到: dict_items([('a', 1), ('c', 3), ('b', 2)])
L=list(d.items()) # 得到列表: L=[('a', 1), ('c', 3), ('b', 2)]
L.sort(key=lambda x:x[1],reverse=False) # 按列表中,每一个元组的第二个元素从小到大排序。
# x代表从L中遍历出的一个元组
print(L) # 得到: [('a', 1), ('b', 2), ('c', 3)]
注意事项:
1. 关键步骤在于:L=list(d.items()),即执行 L = list(dict_items([('a', 1), ('c', 3), ('b', 2)])。
利用list()构造函数将L= dict_items([('a', 1), ('c', 3), ('b', 2)]) 转换为列表,最终得到列表结构: L=[('a', 1), ('c', 3), ('b', 2)] 。
补充说明:经过多次尝试发现,list()构造函数能直接将d.items()生成的dict_items对象转换为列表,这一特性非常实用。
2. 简述列表的L.sort()方法:L.sort(key=函数名, reverse=False/True)。
L.sort()会遍历列表元素,依据key绑定的函数进行排序。
示例:L.sort(key=lambda x:x[1],reverse=False),此时L=[('a', 1), ('c', 3), ('b', 2)]。
该过程从列表L中取出第一个元素('a', 1),以其第二个元素'1'为基准进行排序。
随后依次取出后续元素,确定各自的排序依据。
最终因reverse=False,按从小到大的顺序输出结果。
注:L.sort()还支持其他参数,有兴趣者可查阅官方文档或相关教程。
字典排序的实际应用场景
三、实际应用扩展
作者在使用jieba库进行文本词频统计时,遇到了字典排序的需求。
感兴趣的用户可参考下方代码,或自行选取文本测试,体验十分有趣。
import jieba
with open("天龙八部-网络版.txt",'r',encoding='utf-8') as f:
txt=f.read()
words=jieba.lcut(txt)
d={}
for word in words:
d[word]=d.get(word,0)+1
del d[' ']
del d['\n']
with open("天龙八部-词语统计.txt",'w',encoding='utf-8') as f2:
d=sorted(d.items(),key=lambda x:x[1],reverse=True)
for x,y in d:
f2.write("{}:{}\n".format(x,y))
注:代码还可进一步优化,例如增加文本降噪处理。
四、总结
经过一天的调试与探索,最终解决了字典排序的问题。
以上就是关于Python字典按值排序的实现方法,更多相关内容可搜索本站往期文章或继续阅读后续教程,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









