簡體   English   中英

在Python中排序多維字典

[英]Sort Multidimensional Dict in Python

我正在嘗試根據鍵“ order ”對這個字典進行排序。 請在下面的示例字典中找到:-

{'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中的字典沒有順序。

  • 嘗試對字典進行排序會將字典的key傳遞給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']))

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 ,因為列表需要整數索引。

這里有一個更大的問題-似乎您在整個字典中調用了sorted ,僅包含1個值。 僅對1個條目進行排序是沒有意義的,也不應該對您似乎要排序的內容(即字典的內部列表)進行排序。

如果要對字典的內部列表進行排序(“ about-us”鍵的相應字典值),則需要類似以下內容(也建議使用falsetru):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM