【问题标题】:sorting nested dictionary in python [closed]在python中排序嵌套字典[关闭]
【发布时间】:2018-12-27 10:34:48
【问题描述】:

我有这样的字典:

input = {9: { 3: 0.0003 , 2: 0.0002}, 8: {1: 100.0, 2: 50.0, 3: 300.0}}

输出必须是这样的:

output = {8: {2: 50.0, 1: 100.0, 3: 300.0}, 9: {2: 0.0002, 3: 0.0003}}

尝试了OrderedDictsorted 等,但仍然没有得到我想要的输出。

【问题讨论】:

  • 1.你只想排序然后外层? 2.你知道CPython3.6之前的字典有任意顺序吗? 3. 为什么要对字典进行排序? 4. 请通过OrderedDict展示您的尝试。
  • @timgeb 是的,我也准备好告诉他了 :-)
  • @timgeb 我试过这个 1. OrderedDict(sorted(input.items())) 2. {k: (dict(v.items(), key=operator.itemgetter(1)) ) for k,v in input.items()} 3. dict(sorted(input.items(), key=lambda (x,y): (x,sorted(y.items(), key=lambda (a, b): b))))

标签: python sorting dictionary


【解决方案1】:

改用OrderedDict,因为@timgeb 提到字典在CPython3.6 之前具有任意顺序:

from collections import OrderedDict
OrderedDict(sorted(d.items()))
OrderedDict([(8, {1: 100.0, 2: 50.0, 3: 300.0}), (9, {3: 0.0003, 2: 0.0002})])

【讨论】:

  • 您提出的解决方案与我在上面的问题中提到的所需输出不匹配。
【解决方案2】:

dict理解sorted一起使用两次:

>>> input = {9: { 3: 0.0003 , 2: 0.0002}, 8: {1: 100.0, 2: 50.0, 3: 300.0}}
>>> {k:dict(sorted(v.items())) for k,v in sorted(input.items())}
{8: {1: 100.0, 2: 50.0, 3: 300.0}, 9: {2: 0.0002, 3: 0.0003}}
>>> 

对于 2.7 以下的 python 版本,使用:

>>> input = {9: { 3: 0.0003 , 2: 0.0002}, 8: {1: 100.0, 2: 50.0, 3: 300.0}}
>>> dict([(k,dict(sorted(v.items()))) for k,v in sorted(input.items())])
{8: {1: 100.0, 2: 50.0, 3: 300.0}, 9: {2: 0.0002, 3: 0.0003}}
>>> 

【讨论】:

  • 这不适用于所有 python 版本。就像一个注释。
  • @Netwave 感谢您的注意,我会编辑。
  • 我认为是在python3.6下
  • @Netwave No. python2.7
  • 我认为 Netwave 不是在谈论 dict 理解语法 ;)
【解决方案3】:

你需要申请collectiobs.OrderedDict()两次才能得到内、外排序字典:

from collections import OrderedDict
from operator import itemgetter

data = {9: { 3: 0.0003 , 2: 0.0002}, 8: {1: 100.0, 2: 50.0, 3: 300.0}}

result = OrderedDict(
    sorted(
        (k, OrderedDict(sorted(v.items(), key=itemgetter(1))))
        for k, v in data.items()
    )
)

print(result)

这给出了:

OrderedDict([(8, OrderedDict([(2, 50.0), (1, 100.0), (3, 300.0)])), (9, OrderedDict([(2, 0.0002), (3, 0.0003)]))])

注意: OrderedDict 仅在 @U9-Forwards's 答案所示。

【讨论】:

  • 谢谢兄弟,它对我有用。
猜你喜欢
  • 1970-01-01
  • 2015-11-12
  • 2021-07-27
  • 1970-01-01
  • 2014-09-13
  • 2020-09-17
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多