字典排序:
因为我们都知道字典是无序的,所以也没有想过字典怎么排序,直到……唉
废话不多说,先看按值、按键排序的方法吧。
有一个字典dic1 = {'tired': 1, 'car': 2, 'man': 2, 'of': 1, 'front': 1, 'who': 2, 'in': 1, 'run': 2, 'exhausted': 1, 'get': 2, 'behind': 1}
按值排序:dic2 = sorted(dic1.items(),key=lambda d:d[1],reverse=True)
分析:dic1.items()是类似[('tired',1),('car',2),()...]这样列表套元组的数据类型(但它不是列表,一个小元组就是一个键值对)。
key对应一个匿名函数,参数d是前面那个序列的元素,是个小元组,匿名函数的结果是就是键值对的值。
reverse,默认按从小到大的顺序排序,reverse=True表示反序。
结果:[('car', 2), ('man', 2), ('who', 2), ('run', 2), ('get', 2), ('tired', 1), ('of', 1), ('front', 1), ('in', 1), ('exhausted', 1), ('behind', 1)]
按键排序:dic3 = sorted(dic1.items(),key=lambda d:d[0],reverse=True)
结果:[('who', 2), ('tired', 1), ('run', 2), ('of', 1), ('man', 2), ('in', 1), ('get', 2), ('front', 1), ('exhausted', 1), ('car', 2), ('behind', 1)]
如果直接排序呢?dic4=sorted(dic1)
结果:['behind', 'car', 'exhausted', 'front', 'get', 'in', 'man', 'of', 'run', 'tired', 'who'],只有键没有值。
实例:找出一个字符串中,字符出现频率最高的5个字符及其出现频率。
#有换行,有各种标点符号的字符串
str1 = """Man who run in front of car, get tired.
man who run behind car, get exhausted."""
#为了去除换行符,先分成一行一行的,以换行符为分隔符。
linelist = str1.split('\n')
wordlist2 = []
for line in linelist:
#以空格为分隔符,分成一个单词一个单词的
wordlist = line.split(' ')
for word1 in wordlist:
#去除标点符号最后把所有单词添加到一个列表
lastchar = word1[-1]
if lastchar in [",", ".", "!", "?", ";"]:
word2 = word1.rstrip(lastchar)
else:
word2 = word1
wordlist2.append(word2.lower())
fredic = {}
for word3 in wordlist2:
#统计出现频率,构造字典,键为单词,值为出现频率
fredic[word3] = fredic.get(word3,0) + 1
print(fredic)
#按值排序
fredic2 = sorted(fredic.items(),key=lambda d:d[1],reverse=True)
print(fredic2[0:5])