用Python对多维Dict进行排序

用Python对多维Dict进行排序,python,list,sorting,dictionary,Python,List,Sorting,Dictionary,我正试图根据键“顺序””对这篇文章进行排序。请查收以下样本:- {'about-us': [{'name': 'CONSTITUTION', 'order': u'2', 'uri': 'constitution'}, {'name': 'EXECUTIVE COMMITTEE', 'order': u'3', 'uri': 'executive-committee'}, {'na

我正试图根据键“顺序””对这篇文章进行排序。请查收以下样本:-

{'about-us': [{'name': 'CONSTITUTION', 'order': u'2', 'uri': 'constitution'},
              {'name': 'EXECUTIVE COMMITTEE',
               'order': u'3',
               'uri': 'executive-committee'},
              {'name': 'FINANCIAL INFO',
               'order': u'4',
               'uri': 'financial-info'},
              {'name': 'SPONSORS AND AFFILIATIONS',
               'order': u'5',
               'uri': 'sponsors-and-affiliations'},
              {'name': 'ABOUT', 'order': u'1', 'uri': 'about'}]}
尝试使用此代码,但出现错误

sorted(sub_links, key=lambda x: sub_links[x]['order'])
TypeError:列表索引必须是整数,而不是str


有什么提示吗?

你不能对字典本身进行排序。python中的字典没有顺序

  • 尝试对字典进行排序将把字典的键传递给
    函数<代码>子链接[x]=>
    子链接['about-us']
    <代码>子链接[x]['order']失败,因为
    子链接[x]
    返回一个列表
您可以在字典中对列表进行排序:
d['about-us']


此外,还应更改
排序
函数的用法:将每个项传递给键函数,而不是项的索引

>>> sorted(d['about-us'], key=lambda x: int(x['order']))
[{'uri': 'about', 'name': 'ABOUT', 'order': u'1'},
 {'uri': 'constitution', 'name': 'CONSTITUTION', 'order': u'2'},
 {'uri': 'executive-committee', 'name': 'EXECUTIVE COMMITTEE', 'order': u'3'},
 {'uri': 'financial-info', 'name': 'FINANCIAL INFO', 'order': u'4'},
 {'uri': 'sponsors-and-affiliations', 'name': 'SPONSORS AND AFFILIATIONS', 'order': u'5'}]
如果需要对所有字典值进行适当排序,请循环这些值

for value in d.values(): # use `itervalues` In Python 2.x
    value.sort(key=lambda x: int(x['order']))

falsetru展示了您可能想要做的事情,但以下是您看到的错误的解释:

调用
key
lambda函数时,该函数接收字典的键作为其参数
x
——在这种情况下,当对字典中的一个且唯一的键执行调用时,看起来是这样的:

# this is JUST for demonstrating the execution of the code--this is not actual Python code
lambda("about-us"):
    return sub_links["about-us"]["order"]
执行此操作时,
sub_links[“about us”]
返回该键的值,该键是一个列表。当语句的下一部分执行时(
[“order”]
),会抛出
TypeError
,因为列表需要整数索引

这里有一个更大的问题——似乎您对整个字典调用了
sorted
,它只包含1个值。只使用一个条目对某些内容进行排序是没有意义的,并且不应该使用它对您似乎想要排序的内容进行排序,这是字典的内部列表

如果您想对字典的内部列表进行排序(“about us”键对应的dict值),则需要类似的内容(falsetru也建议):


我没有投反对票。第一个代码中有语法错误。1) lambda的参数是string。2)
lambda
应该是一行(除非它是显式的连续行)3)在
lambda
中不允许有任何语句(
return
),它只是为了演示代码的执行方式。它并不意味着是实际编写的代码。但是查看
lambda
如何使用参数并返回值是很有帮助的(因为
lambda
s非常简洁)。Downvoter:如果有什么问题,请告诉我。这并不能解决问题。”“订单”仍然不是一个问题integer@RichardMiles,是的,
顺序
本身不是整数;所以我添加了
int
call
int(x['order'])
@RichardMiles,OP的问题不是将
顺序
更改为int。而是按
顺序排序。如果这是一个问题,OP(skycrew)没有接受答案。这也不是问题所在。相反,正是错误阻止了所需功能的实现。e、 g.-
TypeError:列表索引必须是整数,而不是str
上述解决方案不能解决此特定错误,因此对于整个问题来说,这不是一个可行的解决方案。
sorted(sub_links["about-us"], key=lambda d: int(d["order"]))