python3.6字典有序_Python如何按值对字典进行排序?
我有一個從數據庫中的兩個字段中讀取值的字典:一個字符串字段和一個數字字段。字符串字段是唯一的,所以這是字典的關鍵。
我可以對鍵進行排序,但是如何根據這些值進行排序?
注意:我已閱讀Stack Overflow問題
答案
無法對字典進行排序,只能得到已排序的字典的表示形式。字典本質上是無序的,但其他類型,如列表和元組,不是。所以你需要一個有序的數據類型來表示排序的值,這將是一個列表 – 可能是一個元組列表。
例如,
importoperator
x= {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}sorted_x=sorted(x.items(),key=operator.itemgetter(1))
sorted_x將是每個元組中第二個元素排序的元組列表。dict(sorted_x) == x。
對于那些希望按鍵而不是數值進行排序的人:
importoperator
x= {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}sorted_x=sorted(x.items(),key=operator.itemgetter(0))
簡單如下:?sorted(dict1, key=dict1.get)
那么,它實際上可以做一個“按字典值排序”。最近我不得不在Code Golf中做這件事(Stack Overflow question
如果您構造一個字典,其中的關鍵詞和每個詞的出現次數為值,在此簡化為:
fromcollectionsimportdefaultdict
d=defaultdict(int)
forwintext.split():d[w] += 1
那么你可以得到一個單詞列表,按使用頻率sorted(d, key=d.get)排序 – 排序迭代字典鍵,使用單詞出現次數作為排序鍵。
forwinsorted(d,key=d.get,reverse=True):
printw,d[w]
我正在寫這個詳細的解釋來說明人們通常所說的“我可以輕松地按鍵排序字典,但我怎么按價值排序” – 我認為OP正試圖解決這個問題。解決方案是根據數值對鍵進行排序,如上所示。
你可以使用:
sorted(d.items(), key=lambda x: x[1])
這將按字典中的每個條目從最小到最大的值對字典進行排序。
字典不能排序,但你可以從它們建立一個排序列表。
字典值的排序列表:
sorted(d.values())
(鍵,值)對的列表,按值排序:
fromoperatorimportitemgetter
sorted(d.items(),key=itemgetter(1))
在最近的Python 2.7中,我們有了新的OrderedDict類型,它記住了添加項目的順序。
>>>d= {"third": 3, "first": 1, "fourth": 4, "second": 2}
>>> fork,vind.items():
... print "%s: %s" % (k,v)
...second: 2fourth: 4third: 3first: 1
>>>d{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}
要從原始中創建一個新的有序字典,按值排序:
>>> fromcollectionsimport OrderedDict
>>>d_sorted_by_value= OrderedDict(sorted(d.items(),key=lambdax:x[1]))
OrderedDict的行為像一個正常的字典:
>>> fork,vind_sorted_by_value.items():
... print "%s: %s" % (k,v)
...first: 1second: 2third: 3fourth: 4
>>>d_sorted_by_valueOrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])
更新:2015年12月5日使用Python 3.5
雖然我發現接受的答案很有用,但我還驚訝于它沒有更新為從標準庫集合模塊中引用
fromoperatorimportitemgetterfromcollectionsimport OrderedDictx= {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}sorted_x= OrderedDict(sorted(x.items(),key=itemgetter(1)))
# OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])
官方
# regular unsorted dictionaryd= {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
# dictionary sorted by value
OrderedDict(sorted(d.items(),key=lambdat:t[1]))
# OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
使用
importcollectionsPlayer =collections.namedtuple('Player', 'score name')d= {'John':5, 'Alex':10, 'Richard': 7}
先以最低分數排序:
worst=sorted(Player(v,k) for (k,v) ind.items())
以最高得分排序:
best=sorted([Player(v,k) for (k,v) ind.items()],reverse=True)
現在你可以得到它的名字和得分,比如說,我們說第二好的球員(index = 1)非常像Python:
player=best[1]player.name'Richard'player.score7
從Python 3.6開始,內置的字典將會被訂購
好消息,所以OP的原始用例將映射從數據庫中檢索的對以唯一的字符串ID作為鍵和數值作為值映射到內置的Python v3.6 + dict中,現在應遵循插入順序。
如果從數據庫查詢中得到如下結果的兩個列表表達式:
SELECT a_key,a_value FROM a_table ORDER BY a_value;
將存儲在兩個Python元組中,k_seq和v_seq(通過數字索引進行對齊,當然長度相同),則:
k_seq= ('foo', 'bar', 'baz')v_seq= (0, 1, 42)ordered_map=dict(zip(k_seq,v_seq))
稍后允許輸出為:
fork,vinordered_map.items():
print(k,v)
在這種情況下產生(對于新的Python 3.6 +內置字典!):
foo0bar1baz42
按每個v值的順序排列。
在我的機器上安裝Python 3.5的地方,它現在會產生:
bar1foo0baz42
細節:
正如Raymond Hettinger在2012年提出的(參見python-dev主題為“更緊湊的詞典,更快的迭代”),現在(2016年),Victor Stinner在Python-dev的郵件中宣布了Python的Python 3.6 dict變為壓縮并獲得一個私有版本;而且由于Python 3.6中的問題27350的修復/實現“緊湊且有序的dict”,我們現在可以使用內置的字典來維護插入順序,因此關鍵字變得有序!
希望這將導致OrderedDict實現的薄層作為第一步。正如@ JimFasarakis-Hilliard所指出的那樣,有些人在將來也會看到OrderedDict類型的用例。我認為,如果這將經得起時間的考驗,接下來的步驟是什么,那么Python社區將會仔細檢查。
現在是時候重新思考我們的編碼習慣,不要錯過穩定排序開放的可能性:
關鍵字參數和
(中級)dict存儲
第一個是因為它在某些情況下簡化了函數和方法的實現。
第二,它鼓勵更容易地使用dicts作為處理管道中的中間存儲。
Raymond Hettinger親切地提供了解釋“?The Python Behind Python 3.6 Dictionaries?”的文檔- 來自他的舊金山Python Meetup Group發布的2016-DEC-08。
也許一些Stack Overflow高級問答頁面會收到這些信息的變體,許多高質量的答案也需要每個版本的更新。
警惕Emptor(但也見下文更新2017-12-15):
正如@ajcr正確地指出:“這個新實現的順序保留方面被認為是一個實現細節,不應該依賴。”?(來自whatsnew36)沒有挑選,但引用被削減了一點悲觀;-)。它繼續為“(這可能會在未來發生變化,但希望在將語言規范更改為強制順序保留語義之前,在少數版本中使用該語言實現此新的dict;這也是所有當前和未來Python實現的保留語義有助于保持與舊版本語言的向后兼容性,即隨機迭代順序仍然有效,例如Python 3.5)。“
正如在一些人類語言(例如德語)中那樣,用法形成了語言,意志現在已經被宣布……在whatsnew36中。
2017-12-15更新:
在發給python-dev名單的郵件中,Guido van Rossum宣稱:
做到這一點。“Dict保持插入順序”是裁決。謝謝!
因此,dict插入排序的3.6版CPython副作用現在已成為語言規范的一部分(而不僅僅是一個實現細節)。collections.OrderedDict正如Raymond Hettinger在討論中提醒的那樣,該郵件線程還提供了一些可區分的設計目標。
我遇到了同樣的問題,我解決了這個問題:
WantedOutput =sorted(MyDict,key=lambdax: MyDict[x])
(回答“不可能排序字典”的人沒有讀到這個問題!事實上,“我可以對鍵進行排序,但是我怎樣才能根據這些值進行排序?”顯然意味著他想要一個列表按照它們的值的值排序的鍵)。
請注意訂單沒有被很好地定義(在輸出列表中,具有相同值的鍵將以任意順序)。
這是代碼:
importoperator
origin_list= [
{"name": "foo", "rank": 0, "rofl": 20000},
{"name": "Silly", "rank": 15, "rofl": 1000},
{"name": "Baa", "rank": 300, "rofl": 20},
{"name": "Zoo", "rank": 10, "rofl": 200},
{"name": "Penguin", "rank": -1, "rofl": 10000}
]
print ">> Original >>"
forfooinorigin_list:
printfooprint "\n>> Rofl sort >>"
forfooinsorted(origin_list,key=operator.itemgetter("rofl")):
printfooprint "\n>> Rank sort >>"
forfooinsorted(origin_list,key=operator.itemgetter("rank")):
printfoo
結果如下:
原版的
{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
ROFL
{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}
秩
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}
總結
以上是生活随笔為你收集整理的python3.6字典有序_Python如何按值对字典进行排序?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3.5安装pip_pip和p
- 下一篇: websocket python爬虫_p