2014-02-14 50 views
1

我在尝试根据“order”这个键对这个字典进行排序。请,发现下面的示例字典: -在Python中对多维字典进行排序

{'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']) 

类型错误:列表索引必须是整数,而不是str的

任何暗示?

回答

2

你不能排序字典本身。 Python中的字典没有订单。

  • 尝试对字典进行排序会将字典的键传递给key函数。 sub_links[x] =>sub_links['about-us']; sub_links[x]['order']失败,因为sub_links[x]返回一个列表。

您可以按字典里面的名单:d['about-us']


另外,sorted功能的使用应改为:sorted通行证每个项目的关键功能,而不是项目的索引。

>>> 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'])) 
+0

其加工。我循环并追加回字典 – skycrew

+0

Downvoter:请让我知道是否有任何问题。 – falsetru

+0

这并不能解决问题。 '订单'仍然不是整数 –

0

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"]返回键,这是一个列表的价值。当语句的下一部分执行(<the list that got returned>["order"])时,TypeError被引发,因为列表需要整数索引。

这里有一个更大的问题 - 看起来你在整个词典中只叫1 sorted,它只包含1个值。对只有1个条目的东西进行排序没有意义,它不应该用来排序你想要排序的东西,这是词典的内部列表。

如果要排序的字典的内部列表(“关于美”键对应的字典值),你需要这样的事情(如falsetru还建议):

sorted(sub_links["about-us"], key=lambda d: int(d["order"])) 
+1

-1并且没有评论?谢谢... – mdscruggs

+0

我没有downvote。第一个代码中有语法错误。 1)lambda的参数是字符串。 2)'lambda'应该是一行(除非它是明确的行续)3)'lambda'('return')中不允许声明 – falsetru

+0

这仅仅是为了演示代码的执行方式。这并不意味着是实际的书面代码。但是看看'lambda'如何消耗参数并返回一个值是有帮助的(因为'lambda's非常简洁)。 – mdscruggs