【问题标题】:Python: Sort nested dictionary by valuePython:按值对嵌套字典进行排序
【发布时间】:2014-05-09 22:53:20
【问题描述】:

我正在使用一个大字典(500 多个键),它的值是 2 个字典(它们的值是数字)和两个列表(一个长度 =~10 的数字,一个长度 =~ 的布尔值) 50)。我想获得某种表示形式,无论是列表还是元组,都可以通过一个内部字典中的一个数值对原始字典进行排序。有没有办法做到这一点?

作为参考,这是我正在使用的(大)字典中键“WHR”的单个条目:

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']['correctRate'] 的值按​​降序对整个字典 'dd_rf' 进行排序。上例中与给定排序条件对应的值是 'correctRate': 0.7901234567901234。

谢谢!如果我可以提供更多背景信息,请告诉我。

【问题讨论】:

  • sorted 与自定义key 函数一起使用。
  • dict 未排序,因此您需要有序类型(列表)的键,或使用 OrderedDict

标签: python sorting dictionary


【解决方案1】:

我不确定您要查找的最终形式是什么,因为将结果填回字典会丢失排序。也许看看 collections.OrderedDict。然而,基本的想法是把你的字典变成一个列表,然后用你的自定义函数对该列表进行排序。例如

answer = sorted(dd_rf.items(), key=lambda (k,v): v['rates']['correctRate'])

这是一般的想法。您可能想先看看类似

sorted(range(10), key=lambda x: (x-5)**2)

有助于加深您的理解。

【讨论】:

  • 我开始理解你提出的想法了。如果您定义的函数中只有 v 出现,为什么还要在键中包含 k?
  • @sgchako dict.items() 是一个返回 (k,v) 元组的生成器,这些元组成为可选键函数的输入。因此,关键函数的输入签名需要匹配(即采用 2 元组)。您可以很好地使用dd_rf.values,但这意味着您会丢失结果排序列表中的键(并且只有值)。或者,您可以使用key=lambda x: x[1]['rates']['correctRate'],但这不太明确且不清楚。
  • @Preet 是的,没错。或者,我可以完成 lambda (_, v): v['rates']['correctRate'],其中 '_' 只是丢弃该值而不是将其绑定到变量。但关键是 lambda _, v: ... 根本不起作用,因为那将是一个需要 2 个参数的函数,而不是单个参数(即长度为 2 的元组)。要在一个简单的示例中看到这一点,请尝试输入 (lambda (_, v): v)( (3,4) ),然后看看会得到什么。鉴于我有这个选项,我仍然选择编写 (k,v) 以明确我正在迭代 (key, value) 对。
猜你喜欢
  • 2014-05-01
  • 2019-09-09
  • 1970-01-01
  • 2021-03-08
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多