字典排序:
因为我们都知道字典是无序的,所以也没有想过字典怎么排序,直到……唉
废话不多说,先看按值、按键排序的方法吧。
有一个字典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(' ') 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])