【问题标题】:Sort dictionary of dictionaries by value Python ( 3 Level Dict ) [closed]按值Python对字典进行排序(3级字典)[关闭]
【发布时间】:2015-04-24 16:43:10
【问题描述】:

我有一个这样的dict

{
 'INT-ABC1': 
    {
        'acc1': {'val': -22313.7381693064, 'Qua': -241.0}, 
        'acc2': {'val': -1312.940854148, 'Qua': -13.0}
    }, 
 'INT-ABC2': 
    {
        'acc1': {'val': -131.2510359399, 'Qua' : -23.0}, 
        'acc3': {'val': -131.40521409002, 'Qua' : -13.0},
        'acc5': {'val': -12312.7688190937, 'Qua' : -1313.0}
    }
}

我需要按 'val' 对其进行排序并从中获取类似的字典。

【问题讨论】:

  • 你能告诉我们你尝试了什么,你在哪里卡住了吗?
  • 字典没有任何顺序
  • 到目前为止你尝试过什么?你希望结果是什么?您想按排序顺序打印它们吗,您是否希望其他一些对象包含有关排序顺序的一些信息?还有什么?
  • Python dicts 未排序。如果你想要一个排序字典,你应该使用collections.OrderedDict

标签: python sorting dictionary python-2.6


【解决方案1】:

这样的东西会起作用,但我认为如果你是从 python 开始的,你应该了解 python 中的 sorted 函数。

>>> sorted(k.items(), key = lambda x: x[1][0].itervalues().next()['val'])

k 是你的字典。

viki.omega9 在他的回答中提供的链接应该是一个很好的起点。

注意:该命令将按以下形式返回一个元组(或对)列表:

[(key1, val1), (key2, val2)]

因为字典本质上是无序的。

【讨论】:

  • 谢谢,但很抱歉我的字典有不同的结构
  • { 'INT-ABC1': { 'acc1': {'val': -22313.7381693064, 'Qua': -241.0}, 'acc2': {'val': -1312.940854148, 'Qua ':-13.0} },'INT-ABC2':{'acc1':{'val':-131.2510359399,'Qua':-23.0},'acc3':{'val':-131.40521409002,'Qua': -13.0},'acc5':{'val':-12312.7688190937,'Qua':-1313.0} } }
  • 您到底希望输出是什么?我想我不明白你在做什么..
【解决方案2】:

考虑使用 sorted 函数。使用this 作为参考。对于您所拥有的情况,您必须使用一个键函数来告诉 python 如何比较您在问题中拥有的字典的两个实体。然后 sorted 函数返回一个您将迭代的列表。

例如,

>>>sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

对于您的情况,您需要从字典中获取项目。

编辑: 首先就像其中一个 cmets 所说,您不能直接在 python 中对 dict 进行排序。我不认为有序的字典是你需要的。您只能对已转换为列表元组的 dict 进行排序。例如 {'a': 'b', 'c': 'd'},必须先转换为 [('a', 'b'), ('c', 'd')] 然后你可以随意选择排序。这里的问题是,一旦执行此操作,就无法将其存储回普通字典中。原因是这不是正常的工作方式。您可以在 python 集合中使用有序字典,它“记住”插入的顺序,因此是一个“排序的”字典。但是如果不做一些工作,您将无法轻松创建“排序”的字典。

对于您的输入,我的示例中的“b”是一个字典。所以你必须做一些工作才能得到你想要的密钥。我假设您想在每个 'INT-ABC' 的 'acc' 值之间进行排序。

>>> k_dict
{'INT-ABC1': {'acc1': {'Qua': -241.0, 'val': -22313.7381693064}, 'acc2': {'Qua': -13.0, 'val': -1312.940854148}}}
>>> k_dict.items()
[('INT-ABC1', {'acc1': {'Qua': -241.0, 'val': -22313.7381693064}, 'acc2': {'Qua': -13.0, 'val': -1312.940854148}})]
>>> k_dict.items()[0][1].items()
[('acc1', {'Qua': -241.0, 'val': -22313.7381693064}), ('acc2', {'Qua': -13.0, 'val': -1312.940854148})]
>>> sorted(k_dict.items()[0][1].items(), key=lambda  x: x[1]['val'])
[('acc1', {'Qua': -241.0, 'val': -22313.7381693064}), ('acc2', {'Qua': -13.0, 'val': -1312.940854148})]

鉴于此,

>>> from collections import OrderedDict
>>> t = OrderedDict()
>>> k_dict.items()[0][0]
'INT-ABC1'
>>> t[k_dict.items()[0][0]] = sorted(k_dict.items()[0][1].items(), key=lambda  x: x[1]['val'])
>>> t
OrderedDict([('INT-ABC1', [('acc1', {'Qua': -241.0, 'val': -22313.7381693064}), ('acc2', {'Qua': -13.0, 'val': -1312.940854148})])])

【讨论】:

  • 我的字典看起来像这样 { 'INT-ABC1': { 'acc1': {'val': -22313.7381693064, 'Qua': -241.0}, 'acc2': {'val': -1312.940854148,'Qua':-13.0} },'INT-ABC2':{'acc1':{'val':-131.2510359399,'Qua':-23.0},'acc3':{'val':-131.40521409002 , 'Qua' : -13.0}, 'acc5': {'val': -12312.7688190937, 'Qua' : -1313.0} } } 我需要排序并从中得到一个类似的字典。我需要按“val”对其进行排序。好心提醒。非常感谢
  • @MarshallWilson 检查我的编辑,我希望你现在可以关注并完成一个 for 循环。
  • @MarshallWilson 如果您仍然需要帮助,请给我发消息。但是这个答案应该被接受,因为它正在做你想做的事情。
猜你喜欢
  • 2020-05-26
  • 2014-01-23
  • 1970-01-01
  • 2019-10-04
  • 2011-02-22
  • 2013-12-26
  • 2011-02-09
相关资源
最近更新 更多