1. 问题描述:
python3中的字典与java或者c++中的map是类似的,本质上是一个东西(两者表达的都是哈希表只是不同语言哈希表的表现形式不一样),哈希表可以对键值对进行映射,但是有的时候需要对字典中的键值对进行排序,下面是对字典中键值对排序的常用方法。
2. 代码如下:
使用sorted方法排序,如果参数为dic.items排序的结果是元组组成的列表
① 按照字典中的键排序规则对字典进行排序,排序之后返回值是元组组成的列表,这里对排序的规则进行了定义,x指元组,x[0]是键,x[1]是值
if __name__ == '__main__':
dic = {"zhangsan": 12, "lisi": 20, "wangwu": 18, "zhaoliu": 25}
dic = sorted(dic.items(), key=lambda x: x[0])
print(dic)
② 按照字典中的值排序规则对字典进行排序,排序之后返回值是元组组成的列表,这里对排序的规则进行了定义,x指元组,x[0]是键,x[1]是值
if __name__ == '__main__':
dic = {"zhangsan": 12, "lisi": 20, "wangwu": 18, "zhaoliu": 25}
dic = sorted(dic.items(), key=lambda x: x[1])
print(dic)
③ 对字典中的键排序,返回的是键对应的列表:
if __name__ == '__main__':
dic = {"zhangsan": 12, "lisi": 20, "wangwu": 18, "zhaoliu": 25}
dic = sorted(dic.keys())
print(dic)
④ 对字典中的值排序,返回的是值对应的列表:
if __name__ == '__main__':
dic = {"zhangsan": 12, "lisi": 20, "wangwu": 18, "zhaoliu": 25}
dic = sorted(dic.values())
print(dic)
⑤ 有的时候需要对值进行升序(降序)排序,对键进行降序(升序)排序,如果键为数字或者是一个字符对应的字符串,值为int类型或者字符串类型,这个时候可以使用lambda表达式设置排序的规则,当字典中的值为类型为int整型的时候那么可以在排序的时候添加一个负号那么就可以实现降序排序了(前提是reverse=False或者是默认不写),对于字符间的排序可以将其转化为对应的acsii值(使用ord函数获取字母对应的ascii值)并且添加上负号进行降序排序。当值为降序排列,键为升序排列的时候那么就可以添加上reverse=True即可
import collections
if __name__ == '__main__':
# 出现频率高的数字那么应该排列在后面, 频率相同的那么数字大的排列在前面
arr = [1, 1, 3, 3, 3, 2, 2, 2]
dic = collections.defaultdict(int)
for num in arr:
dic[num] += 1
# 对值进行升序排序, 对键进进行降序排序
dic = sorted(dic.items(), key=lambda x:(x[1], -x[0]))
print(dic)
arr = ["a", "a", "c", "c", "c", "b", "b", "b"]
dic = collections.defaultdict(int)
for c in arr:
dic[c] += 1
dic = sorted(dic.items(), key=lambda x: (x[1], -ord(x[0])))
print(dic)
⑥ 有的时候字典中的键为字符串,值为出现的次数,要求:按照字符串的次数由大到小排序,若字符串出现次数相同的时候那么按照字符串的字典序大小排序。其实在使用lambda表达式对字典进行排序的时候:sorted(dic.items(),key=lambda x:...)中如果写上了items(),表示按照键值对进行排序,其中lambda x中的x表示每一个键值对对应的元组:我们在排序的时候可以按照双关键字进行排序,例如dic = sorted(dic.items(), key=lambda w: (-dic[w[0]], w[1])),其中w表示键值对对应的元组,所以按照出现次数进行排序的时候dic[w[0]]表示字符串的出现次数,w[0]表示字符串,w[1]表示字符串的出现次数,所以在排序的时候写-dic[w[0]]或者-w[1]都可以,添加负号相当于是按照字符串出现次数由大到小排序。
import collections
if __name__ == '__main__':
s = ["i", "love", "i", "you", "love"]
dic = collections.defaultdict(int)
for w in s:
dic[w] += 1
dic = sorted(dic.items(), key=lambda w: (-w[1], w[0]))
print(dic)
s = ["i", "love", "i", "you", "love"]
dic = collections.defaultdict(int)
for w in s:
dic[w] += 1
dic = sorted(dic, key=lambda w: (-dic[w], w))
print(dic)