Python报错Expected dict, got list:字典值排序问题排查
解决排序字典值后出现"Expected dict, got list"的问题
我一眼就看出问题出在哪啦!你这段代码的核心错误是把排序后的列表当成字典来用了,咱们一步步拆解:
错误原因分析
你写的第一行代码:
cdef dict task_ranku_sorted = sorted(task_ranku.values())
task_ranku.values()会取出字典里所有的数值,sorted()对这些数值排序后,返回的是一个排序后的数值列表,根本不是字典!你却把它赋值给了dict类型的变量,这本身就不符合类型要求。
然后第二行:
for key, value in task_ranku_sorted.iteritems():
iteritems()是字典独有的方法,列表根本没有这个方法,而且列表里只有数值,没有键值对,自然会报错。
正确的实现方式
如果你想保留键值对,同时按照task_ranku的值排序,应该对字典的键值对元组进行排序,而不是只取values。修改后的代码如下:
# 按值排序,保留键值对,返回的是元素为(key, value)元组的列表 cdef list task_ranku_sorted = sorted(task_ranku.items(), key=lambda x: x[1]) # 如果需要倒序排序,加上reverse=True即可: # cdef list task_ranku_sorted = sorted(task_ranku.items(), key=lambda x: x[1], reverse=True) # 遍历排序后的列表,直接拆包键值对 for key, value in task_ranku_sorted: print(key, value)
关键说明:
task_ranku.items()会返回字典中所有的键值对元组,比如(task_obj, rank_value)sorted()的key=lambda x: x[1]指定了**按元组的第二个元素(也就是字典的值)**来排序- 排序后的结果是一个列表,每个元素是键值对元组,遍历的时候直接拆包
key和value就可以,不需要用iteritems()
这样修改后,就能正确打印出按ranku值排序后的键值对啦!
内容的提问来源于stack exchange,提问作者arcoxia tom
相关产品推荐
相关产品推荐

