嵌套字典获取按值排序的键

时间:2013-10-06 01:23:08

标签: python dictionary sorted

我正在使用嵌套字典的字典:

dicc={ 'a': {'a1': 1 }, 'b':{'b1':2 }, 'c':{'c1':3 } }
# This is an example. I have lots of other keys and values.

我需要获取按值排序的键。例如,得到 c,b,a值:我将按此顺序处理它们;首先,我需要使用c执行其他操作,然后b然后a

我用它来获取最大值,但我需要所有的值并使用它们以便市长为次要:

valores=list(diccionario.values())

claves= list(diccionario.keys())

value_= claves[valores.index(max(valores))]

编辑: 我需要得到 c,b,按此顺序排序而不使用b c,因为c具有最高的c1值等。 好吧,它可以反向排序一个字典,但让我说我有这个数据:

1000 10 20 7 2 0

1001 3 30 3 5 0

1002 3 10 5 3 0

1003 7 22 3 1 0

第二列是先前的,所有这些都存储在字典中,主键是1000,1001,1002,1003,其余都是值,我想得到1000,1003,1002,1001(这最后有相同的先验)在此订单上,

2 个答案:

答案 0 :(得分:0)

根据您所说的所有内容,我认为这就是您想要的:

>>> dicc= { 'a': {'a1': 1 }, 'b':{'b1':2 }, 'c':{'c1':3 } }
>>> sorted(dicc, reverse=True)
['c', 'b', 'a']

如果那不是您想要的,请显示完全您想要的是什么; - )

答案 1 :(得分:0)

通常情况下,按键排序键很容易:

>>> d = {'a': 1, 'b': 20, 'c': -3}
>>> list(d.items())
[('a', 1), ('b', 20), ('c', -3)]
>>> sorted(d.items(), key=operator.itemgetter(1))
[('c', -3), ('a', 1), ('b', 20)]
>>> [k for k, v in sorted(d.items(), key=operator.itemgetter(1))] 
['c', 'a', 'b']

您可以通过在reverse=True之后添加key来反转排序。

但是你不只是为每个值都有一个数字,你有一个字典,并且你想对每个字典中的c1值进行排序,对吧?所以,只需更改关键功能即可。我们想要每个键值元组的index-1值的c1值,这在itemgetter方面写得有点复杂,所以让我们使用lambda:

>>> d = {'a': {'c1': 1}, 'b': {'c1':2}, 'c': {'c1':3}}
>>> sorted(d.items(), key=lambda kv: kv[1]['c1'], reverse=True)
[('c', {'c1': 3}), ('b', {'c1': 2}), ('a', {'c1': 1})]

这不适用于您的示例数据,因为并非所有值都具有'c1'键。如果您希望将所有c1 - 更少的值推送到最后,您只需将它们视为低于任何其他值c1即可。例如:

>>> d = {'a': {'a1': 1}, 'b': {'b1':2}, 'c': {'c1':3}}
>>> sorted(d.items(), key=lambda kv: kv[1].get('c1', float('-inf')), reverse=True)
[('c', {'c1': 3}), ('b', {'b1': 2}), ('a', {'a1': 1})]

(此处ab的顺序与其原始顺序相反,因为排序是稳定的,这意味着两个相等的值按原始顺序保留,但随后您将其反转。 )