波韬 2022-06-01 23:45 采纳率: 100%
浏览 16
已结题

元组没法作为字典的键?

我在做一道需要接收选手姓名和成绩,并按照成绩进行排名的题目时遇到了这样的问题:
我将选手姓名和成绩导入了一个字典,由于不知道字典如何排序,我想通过提取字典的值成列表之后对这个列表进行排序,再根据排好序的列表查找字典的键的方法导出排名。
这是我的代码:
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'>
处出现了元组不该有的[],我猜这可能是原因,但是我不知道怎么改
感谢大家指点!

  • 写回答

1条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-06-02 01:21
    关注

    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}")
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月10日
  • 已采纳回答 6月2日
  • 创建了问题 6月1日

悬赏问题

  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿
  • ¥15 Matlab在app上输入带有矩阵形式的初始条件发生错误
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址