在python中排序嵌套字典

在python中排序嵌套字典,python,django,Python,Django,我有一个嵌套字典(类别和子类别),dict,排序时遇到问题 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'othe

我有一个嵌套字典(类别和子类别),
dict
,排序时遇到问题

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'}}...

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

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

python字典(常规<代码> DICT< /COD>实例)没有排序。如果您想对dict进行排序,您可以:

from collections import OrderedDict

mynewdict = OrderedDict(sorted(yourdict.items()))
OrderedDict不提供排序机制,但只考虑插入到其上的键的顺序(我们对这些键进行排序,调用sorted previous)

因为您需要一个特定的条件(假设您的键按字母顺序排列,除了最后的“其他”键),所以您需要声明它:

def mycustomsort(key):
    return (0 if key != 'other' else 1, key)
mynewdict = OrderedDict(sorted(yourdict.items(), key=mycustomsort))
通过这种方式,您可以为嵌套的条件创建一个元组:第一个条件是other vs.no other,因此0或1(因为1更大,其他更晚),而第二个条件是键本身。如果需要,您可以删除第二个条件而不返回元组,但只返回0和1,代码将不按字母顺序排序

如果您计划稍后编辑词典,此解决方案将不起作用,并且没有标准类支持此功能

Python字典(常规
dict
实例)未排序。如果您想对dict进行排序,您可以:

from collections import OrderedDict

mynewdict = OrderedDict(sorted(yourdict.items()))
OrderedDict不提供排序机制,但只考虑插入到其上的键的顺序(我们对这些键进行排序,调用sorted previous)

因为您需要一个特定的条件(假设您的键按字母顺序排列,除了最后的“其他”键),所以您需要声明它:

def mycustomsort(key):
    return (0 if key != 'other' else 1, key)
mynewdict = OrderedDict(sorted(yourdict.items(), key=mycustomsort))
通过这种方式,您可以为嵌套的条件创建一个元组:第一个条件是other vs.no other,因此0或1(因为1更大,其他更晚),而第二个条件是键本身。如果需要,您可以删除第二个条件而不返回元组,但只返回0和1,代码将不按字母顺序排序


如果您计划稍后编辑词典,此解决方案将不起作用,并且没有标准类支持此功能

A可能对您有用您希望对类别进行排序有什么特殊原因吗?Python
dict
s本身就是无序的,但是有一个
OrderedDict
可以记住键的添加顺序。一个可能对您有用的方法您希望对类别进行排序有什么特别的原因吗?Python
dict
s本身就是无序的,但是有一个
OrderedDict
可以记住键添加的顺序。所以你是说没有办法做到这一点?如果你想要排序,你甚至不应该使用
dict
。您可以使用
OrderedDict
来解决这个问题,但我觉得使用元组中的元组更有意义。谢谢您的见解。为什么建议使用元组而不是OrderedDict?
OrderedDict
并非在所有python版本中都可用,而且元组是不可变的,因此它更快,而且肯定会保留序列,除非您需要来自
dict
的O(1)访问时间,在这种情况下,您将使用
OrderedDict
。那么您是说没有办法实现这一点?如果您想要订购,您甚至不应该使用
dict
。您可以使用
OrderedDict
来解决这个问题,但我觉得使用元组中的元组更有意义。谢谢您的见解。为什么建议使用元组而不是OrderedDict?
OrderedDict
并不是在所有python版本中都可用,而且元组是不可变的,所以它更快,而且绝对保留了序列,除非您需要从
dict
获得O(1)访问时间,在这种情况下,您将使用
OrderedDict
。感谢您提供了完整的解决方案!这在我的用例中非常有效。实际上,这并没有将Other移到末尾,它只是按字母顺序排序。函数更正为:def mycustomsort(key):return(如果key else 1中没有“Other”,则返回0),感谢您提供了完整的解决方案!这在我的用例中非常有效。实际上,这不会将Other移到末尾,它只是按字母顺序排序。函数更正为:def mycustomsort(key):return(如果key else 1中没有“Other”,则返回0,key)