2014-02-14 51 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