我在做一道需要接收选手姓名和成绩,并按照成绩进行排名的题目时遇到了这样的问题:
我将选手姓名和成绩导入了一个字典,由于不知道字典如何排序,我想通过提取字典的值成列表之后对这个列表进行排序,再根据排好序的列表查找字典的键的方法导出排名。
这是我的代码:
def find_key(input_dict,a):
return next((k for k,v in input_dict.items()if v==a),None)
l1 = [input("输入选手姓名,以空格分隔").split(" ")]#接收姓名
#print (l1)
name = tuple(item for item in l1)
#print(name,type(name))
dic = dict.fromkeys(name)
for i in name:
print ("输入选手",i,"的票数")
dic[i] = eval(input())#接收票数
l2 = dic.values()
marklist = l2.sort()
print("排名依次为")
for a in marklist:
find_key(dic,a)
print ("选手的票数为",a)
这是我的报错:
File "C:/", line 7, in
dic = dict.fromkeys(name)
TypeError: unhashable type: 'list'
所以我对name的类型进行了验证,结果如下(验证部分的代码在#注释掉的那里):
输入选手姓名,以空格分隔张三 李四 王五
[['张三', '李四', '王五']]
(['张三', '李四', '王五'],) <class 'tuple'>
明明是元组,但是没法作为键使用,我注意到在
(['张三', '李四', '王五'],) <class 'tuple'>
处出现了元组不该有的[],我猜这可能是原因,但是我不知道怎么改
感谢大家指点!
split()返回的本身就是列表,所以不用再加中括号
l1 = input("输入选手姓名,以空格分隔").split(" ") #接收姓名
另外,你用排序,不用这么麻烦,直接调用字典的items()方法,对键值对进行排序即可
result = sorted(dic.items(),key=lambda x:x[1],reverse=True)
print("排名依次为")
for i, j in result:
print(f"选手{i}的票数为{j}")