Python:按值对嵌套字典排序
我正在使用一个大型字典(500多个键),它有两个字典(它们的值是数字)和两个列表(一个是长度为10的数字,一个是长度为50的布尔)。我想得到某种表示,不管是列表还是元组,它通过一个内部字典中的一个数值对原始字典进行排序。有办法做到这一点吗 以下是我正在使用的(大型)词典中“WHR”键的单个条目,仅供参考:Python:按值对嵌套字典排序,python,sorting,dictionary,Python,Sorting,Dictionary,我正在使用一个大型字典(500多个键),它有两个字典(它们的值是数字)和两个列表(一个是长度为10的数字,一个是长度为50的布尔)。我想得到某种表示,不管是列表还是元组,它通过一个内部字典中的一个数值对原始字典进行排序。有办法做到这一点吗 以下是我正在使用的(大型)词典中“WHR”键的单个条目,仅供参考: dd_rf['WHR'] = {'counts': {'num': 81.0, 'numClassCorrect': 64, 'numClassDown': 20, 'numCla
dd_rf['WHR'] = {'counts': {'num': 81.0,
'numClassCorrect': 64,
'numClassDown': 20,
'numClassDownCorrect': 20,
'numClassIncorrect': 17.0,
'numClassUp': 61,
'numClassUpCorrect': 44,
'numDown': 37,
'numUp': 44},
'imp': array([ 0.50924113, 0.06348138, 0.07851569, 0.03005051, 0.04103215,
0.05646218, 0.03682958, 0.03642228, 0.04282599, 0.01439416,
0.03090185, 0.0598431 ]),
'rates': {'correctDownRate': 1.0,
'correctRate': 0.7901234567901234,
'correctUpRate': 0.7213114754098361,
'downRate': 0.4567901234567901,
'upRate': 0.5432098765432098},
'results': array([False, False, True, True, True, True, False, False, True,
False, True, True, False, False, True, False, True, True,
True, True, True, True, True, True, True, False, False,
True, True, True, True, True, True, True, True, True,
True, False, True, False, False, True, True, True, True,
True, True, True, True, False, True, False, True, True,
True, True, True, False, False, False, True, True, True,
True, True, True, True, True, True, True, False, True,
True, True, False, True, True, True, True, True, True], dtype=bool)}
因此,在我的工作中,我想按照'dd_rf[key]['rates']['correcrate']的值降序排列整个字典'dd_rf'。与上例中给定排序条件相对应的值为“correcrate”:0.7901234567901234
谢谢!如果我能提供更多的背景信息,请告诉我。我不确定您要查找的最终表单是什么,因为将结果塞回字典会丢失顺序。也许可以看看收藏品。但是,基本思想是将字典转换为一个列表,然后使用自定义函数对该列表进行排序。e、 g
answer = sorted(dd_rf.items(), key=lambda (k,v): v['rates']['correctRate'])
这是总的想法。你可以先看看
sorted(range(10), key=lambda x: (x-5)**2)
努力建立您的理解。使用自定义的
键函数使用排序的。dict是未排序的,因此您需要一个有序类型(列表)的键,或者使用有序的dict。我开始理解您提出的想法。如果您定义的函数中只出现v,为什么要在键中包含k?@sgchakodict.items()
是一个生成器,它返回(k,v)
元组,这些元组成为可选键函数的输入。因此,键函数的输入签名需要匹配(即采用2元组)。您可以很好地使用dd_rf.values
,但这意味着您在结果排序列表中丢失了键(并且只有值)。或者,您可以执行key=lambda x:x[1]['rates']['correcrate']
,但这不太明确,也不清楚。@Preet yea是的。或者,我可以执行lambda(v,v):v['rates']['correcrate'],其中'v'只是丢弃该值,而不是将其绑定到变量。但问题是,lambda,v:。。。根本不起作用,因为这将是一个需要2个参数的函数,而不是一个参数(即长度为2的元组)。要在一个简单的示例中看到这一点,请尝试键入(lambda(z,v):v)((3,4)),然后查看得到的结果。考虑到我有这个选项,我仍然选择写(k,v)来明确我是在迭代(键,值)对。