2016-07-22 86 views
0

我有一个嵌套字典(类别和子类别),dict,我有排序困难。在Python中订购嵌套字典

dict输出是:

{u'sports': {u'basketball': {'name': u'Basketball', 'slug': u'basketball'}, u'baseball': {'name': u'Baseball', 'slug': u'baseball'}}, u'dance': {u'salsa': {'name': u'Salsa', 'slug': u'salsa'}}, u'arts': {u'other-5': {'name': u'Other', 'slug': u'other-5'}, u'painting': {'name': u'Painting', 'slug': u'painting'}}, u'music': {u'cello': {'name': u'Cello', 'slug': u'cello'}, u'accordion': {'name': u'Accordion', 'slug': u'accordion'}}} 

我如何排序这本字典,这样的“其他”子类别总是在嵌套字典的结尾出现了。例如,“艺术”类别的订单应该是:

..., u'arts': {u'painting': {'name': u'Painting', 'slug': u'painting'}, u'other-5': {'name': u'Other', 'slug': u'other-5'}}... 
+2

[OrderedDict](https://docs.python.org/2/library/collections.html#ordereddict-objects)可能对您有用 – Greg

+0

是否有任何特殊原因需要订购类别? Python'dict'本质上是无序的,但有'OrderedDict'记住了键的添加顺序。 –

回答

0

Python字典(常规dict实例)未排序。如果要排序的字典,你可以:

from collections import OrderedDict 

mynewdict = OrderedDict(sorted(yourdict.items())) 

的OrderedDict不提供排序机制,但只有尊重插入其上的键的顺序(我们整理这些键调用预先排序)。

由于需要特定条件(可以说你的钥匙按字母顺序排列,除了“其他”键都到年底),你需要把它声明:

def mycustomsort(key): 
    return (0 if key != 'other' else 1, key) 
mynewdict = OrderedDict(sorted(yourdict.items(), key=mycustomsort)) 

这样,你正在创建一个用于嵌套标准的元组:第一个标准是other和no-other,所以0或1(因为1更大,其他则更晚),而第二个标准是密钥本身。你可以删除第二个标准,如果你想要的话不要返回一个元组,但只有0和1,而且代码不需要按字母顺序排序。

如果您打算稍后编辑字典,并且没有支持该字典的标准类,此解决方案将不起作用

+0

感谢您提供完整的解决方案!这对我的用例非常合适。 –

+0

其实这不会将其他移动到最后,它只是按字母顺序排列。 –

+0

函数更正为:def mycustomsort(key): return(0如果'other'不在关键字else中,则关键字) –

3

您对字典有一些主要概念误解。 python中的字典就像是hash table,散列表没有顺序。字典的输出真的是依赖于环境的,所以你不能依赖它。您可能会看到输出的一种方式,而其他人则会看到另一种方式。您应该考虑使用OrderedDict

+0

所以你说有没有办法做到这一点? –

+1

如果你想要订购,你甚至不应该使用'dict'。你可以使用'OrderedDict'离开它,但是我觉得使用元组元组会更有意义。 –

+0

谢谢你的洞察力。你为什么推荐OrderedDict的元组? –