场景
某个列表中包含多个数字,有些数字会有重复,现在需要统计每个数字重复的次数,并且根据重复的次数降序排列这些数字
思考
既然要统计重复次数,并且还需要根据重复次数排序,既包括了元素,还包括重复次数。
具体步骤如下: |
- 将字典的KV对互换位置,然后使用sorted排序算法默认对字典的key进行排序
- 使用匿名函数,自定义排序方式
随机数字典
import random
def get_num(m,n):
num_dict={}
for _ in range(m):
num=random.randint(1, n)
if num not in num_dict:
num_dict[num] = 1 #第一次添加至字典的元素,设置重复次数为1
else:
num_dict[num]+=1 #后续重复的逐步加1
return num_dict
(一) 字典倒装排序
#因为字典的value值也有可能重复,因此在进行倒装时不能简单地将kv互换,将value相同的key都放入一个列表中,
#并且将value作为key,将列表作为value,最后再根据后来的key进行排序
def sort_dict(d):
temp={} ##先定义一个临时字典,用于存放倒装后的字典
for k,v in d.items():
temp.setdefault=(v,[]) #根据重复次数来建立kv对
temp[v].append(k) #将重复次数都一样的数字都放入列表中
resv=[(k,v) for v in sorted(temp,reverse=True) for k in temp[v]] #对倒装后的字典进行倒序排序,此时重复次数作为key
return resv #按照key进行排序,key最大的排在前面
#然后再使用解析式重新生成一个列表,列表中的元素都是二元组
#元组的第一个元素是数字,第二个元素是重复次数
因此,完整的代码为:
import random
def get_num(m,n):
num_dict={}
for _ in range(m):
num=random.randint(1, n)
if num not in num_dict:
num_dict[num] = 1 #第一次添加至字典的元素,设置重复次数为1
else:
num_dict[num]+=1 #后续重复的逐步加1
return num_dict
def sort_dict(d):
temp={} ##先定义一个临时字典,用于存放倒装后的字典
for k,v in d.items():
temp.setdefault(v,[]) #根据重复次数来建立kv对
temp[v].append(k) #将重复次数都一样的数字都放入列表中
resv=[(k,v) for v in sorted(temp,reverse=True) for k in temp[v]]
return resv
m=int(input('随机数个数为:'))
n=int(input('随机数范围是0~?:'))
sort_dict(get_num(m,n))
(二)匿名函数排序
resv=sorted(num_dict.items() key=lambda num_dict:num_dict[1],reverse=True)