一.红包运气排行榜问题描述
小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。
二.思路描述
以样例1为例n = 4 ,s = ["a", "b", "c", "d"] ,x = [1, 2, 2, 1]
输出:['b', 'c', 'a', 'd']
原先通过字典生成式
num_dict=[key:value for key,vlaue in zip(x,s)]
生成{'a':1,'b':2,'c':2,'d':1}字典,然后通过sorted按照字典键值对的值进行排序,就可以直接得到{'b':2,'c':2,'a':1,'d':1},从而进一步得到排好的序列
[b,c,a,d]。
但如果有人问我:“在数字相同的情况下,不用再对字母按照字母表中的顺序进行排序”。其实答案也很简单,因为sorted排序时会默认保持字母原顺序不变,而字母原顺序本来就是在字母表中的顺序。
三.问题出现
当我认为这样就没有问题时出现了一个我想不到的测试案例
n=12
s=["aa","aaaaaaa","aaaa","aaaa","aaaa","aaaaaaaaaa","aaaaaaaaa","aaaa","aaaaaaaaaa","aaaaaaaaa","aaaaa","aaaa"]
x=[17,14,11,2,8,16,14,17,10,6,5,12]
其实这个案例最大的问题在于出现了一种人的脑回路想不到的特殊情况——重复领红包,当我把我刚才的思路运用于这个测试案例的时候,发现根本用不了一点,我需要重新修改num_dict的生成方法,后来豆包给我提供了一种之前很少用的方法collections库中的defaultdict
问题解决
defaultdict 是 Python collections 模块中的一个类,它是内置字典类型 dict 的子类。defaultdict 的主要特点是,当访问字典中不存在的键时,它会自动为该键生成一个默认值,而不是抛出 KeyError 异常。这个默认值是通过一个工厂函数(default_factory)来提供的,该函数在访问不存在的键时被调用。
所以用defaultdict来处理重复数据问题就变得非常简单了。以下是我的修改后的代码:
from collections import defaultdict
def solution(n: int, s: list, x: list) -> list:
# write code here
num_dict=defaultdict(int)
for i in range(n):
num_dict[s[i]]+=x[i]
num_list=sorted(num_dict.items(),key=lambda item:item[1],reverse=True)
num_list=[item[0] for item in num_list]
return num_list
if __name__ == '__main__':
print(solution(4, ["a", "b", "c", "d"], [1, 2, 2, 1]))
print(solution(3, ["x", "y", "z"], [100, 200, 200]) == ['y', 'z', 'x'])
print(solution(5, ["m", "n", "o", "p", "q"], [50, 50, 30, 30, 20]) == ['m', 'n', 'o', 'p', 'q'])
通过defaultdict重新生成num_dict,并加上之前的排序方法问题就变得非常简单了。 以上就是我本次的学习体验啦!