python3.6字典有序_Python如何按值对字典进行排序?
我有一個(gè)從數(shù)據(jù)庫(kù)中的兩個(gè)字段中讀取值的字典:一個(gè)字符串字段和一個(gè)數(shù)字字段。字符串字段是唯一的,所以這是字典的關(guān)鍵。
我可以對(duì)鍵進(jìn)行排序,但是如何根據(jù)這些值進(jìn)行排序?
注意:我已閱讀Stack Overflow問題
答案
無法對(duì)字典進(jìn)行排序,只能得到已排序的字典的表示形式。字典本質(zhì)上是無序的,但其他類型,如列表和元組,不是。所以你需要一個(gè)有序的數(shù)據(jù)類型來表示排序的值,這將是一個(gè)列表 – 可能是一個(gè)元組列表。
例如,
importoperator
x= {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}sorted_x=sorted(x.items(),key=operator.itemgetter(1))
sorted_x將是每個(gè)元組中第二個(gè)元素排序的元組列表。dict(sorted_x) == x。
對(duì)于那些希望按鍵而不是數(shù)值進(jìn)行排序的人:
importoperator
x= {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}sorted_x=sorted(x.items(),key=operator.itemgetter(0))
簡(jiǎn)單如下:?sorted(dict1, key=dict1.get)
那么,它實(shí)際上可以做一個(gè)“按字典值排序”。最近我不得不在Code Golf中做這件事(Stack Overflow question
如果您構(gòu)造一個(gè)字典,其中的關(guān)鍵詞和每個(gè)詞的出現(xiàn)次數(shù)為值,在此簡(jiǎn)化為:
fromcollectionsimportdefaultdict
d=defaultdict(int)
forwintext.split():d[w] += 1
那么你可以得到一個(gè)單詞列表,按使用頻率sorted(d, key=d.get)排序 – 排序迭代字典鍵,使用單詞出現(xiàn)次數(shù)作為排序鍵。
forwinsorted(d,key=d.get,reverse=True):
printw,d[w]
我正在寫這個(gè)詳細(xì)的解釋來說明人們通常所說的“我可以輕松地按鍵排序字典,但我怎么按價(jià)值排序” – 我認(rèn)為OP正試圖解決這個(gè)問題。解決方案是根據(jù)數(shù)值對(duì)鍵進(jìn)行排序,如上所示。
你可以使用:
sorted(d.items(), key=lambda x: x[1])
這將按字典中的每個(gè)條目從最小到最大的值對(duì)字典進(jìn)行排序。
字典不能排序,但你可以從它們建立一個(gè)排序列表。
字典值的排序列表:
sorted(d.values())
(鍵,值)對(duì)的列表,按值排序:
fromoperatorimportitemgetter
sorted(d.items(),key=itemgetter(1))
在最近的Python 2.7中,我們有了新的OrderedDict類型,它記住了添加項(xiàng)目的順序。
>>>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}
要從原始中創(chuàng)建一個(gè)新的有序字典,按值排序:
>>> fromcollectionsimport OrderedDict
>>>d_sorted_by_value= OrderedDict(sorted(d.items(),key=lambdax:x[1]))
OrderedDict的行為像一個(gè)正常的字典:
>>> 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
雖然我發(fā)現(xiàn)接受的答案很有用,但我還驚訝于它沒有更新為從標(biāo)準(zhǔn)庫(kù)集合模塊中引用
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}
先以最低分?jǐn)?shù)排序:
worst=sorted(Player(v,k) for (k,v) ind.items())
以最高得分排序:
best=sorted([Player(v,k) for (k,v) ind.items()],reverse=True)
現(xiàn)在你可以得到它的名字和得分,比如說,我們說第二好的球員(index = 1)非常像Python:
player=best[1]player.name'Richard'player.score7
從Python 3.6開始,內(nèi)置的字典將會(huì)被訂購(gòu)
好消息,所以O(shè)P的原始用例將映射從數(shù)據(jù)庫(kù)中檢索的對(duì)以唯一的字符串ID作為鍵和數(shù)值作為值映射到內(nèi)置的Python v3.6 + dict中,現(xiàn)在應(yīng)遵循插入順序。
如果從數(shù)據(jù)庫(kù)查詢中得到如下結(jié)果的兩個(gè)列表表達(dá)式:
SELECT a_key,a_value FROM a_table ORDER BY a_value;
將存儲(chǔ)在兩個(gè)Python元組中,k_seq和v_seq(通過數(shù)字索引進(jìn)行對(duì)齊,當(dāng)然長(zhǎng)度相同),則:
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)
在這種情況下產(chǎn)生(對(duì)于新的Python 3.6 +內(nèi)置字典!):
foo0bar1baz42
按每個(gè)v值的順序排列。
在我的機(jī)器上安裝Python 3.5的地方,它現(xiàn)在會(huì)產(chǎn)生:
bar1foo0baz42
細(xì)節(jié):
正如Raymond Hettinger在2012年提出的(參見python-dev主題為“更緊湊的詞典,更快的迭代”),現(xiàn)在(2016年),Victor Stinner在Python-dev的郵件中宣布了Python的Python 3.6 dict變?yōu)閴嚎s并獲得一個(gè)私有版本;而且由于Python 3.6中的問題27350的修復(fù)/實(shí)現(xiàn)“緊湊且有序的dict”,我們現(xiàn)在可以使用內(nèi)置的字典來維護(hù)插入順序,因此關(guān)鍵字變得有序!
希望這將導(dǎo)致OrderedDict實(shí)現(xiàn)的薄層作為第一步。正如@ JimFasarakis-Hilliard所指出的那樣,有些人在將來也會(huì)看到OrderedDict類型的用例。我認(rèn)為,如果這將經(jīng)得起時(shí)間的考驗(yàn),接下來的步驟是什么,那么Python社區(qū)將會(huì)仔細(xì)檢查。
現(xiàn)在是時(shí)候重新思考我們的編碼習(xí)慣,不要錯(cuò)過穩(wěn)定排序開放的可能性:
關(guān)鍵字參數(shù)和
(中級(jí))dict存儲(chǔ)
第一個(gè)是因?yàn)樗谀承┣闆r下簡(jiǎn)化了函數(shù)和方法的實(shí)現(xiàn)。
第二,它鼓勵(lì)更容易地使用dicts作為處理管道中的中間存儲(chǔ)。
Raymond Hettinger親切地提供了解釋“?The Python Behind Python 3.6 Dictionaries?”的文檔- 來自他的舊金山Python Meetup Group發(fā)布的2016-DEC-08。
也許一些Stack Overflow高級(jí)問答頁(yè)面會(huì)收到這些信息的變體,許多高質(zhì)量的答案也需要每個(gè)版本的更新。
警惕Emptor(但也見下文更新2017-12-15):
正如@ajcr正確地指出:“這個(gè)新實(shí)現(xiàn)的順序保留方面被認(rèn)為是一個(gè)實(shí)現(xiàn)細(xì)節(jié),不應(yīng)該依賴。”?(來自whatsnew36)沒有挑選,但引用被削減了一點(diǎn)悲觀;-)。它繼續(xù)為“(這可能會(huì)在未來發(fā)生變化,但希望在將語(yǔ)言規(guī)范更改為強(qiáng)制順序保留語(yǔ)義之前,在少數(shù)版本中使用該語(yǔ)言實(shí)現(xiàn)此新的dict;這也是所有當(dāng)前和未來Python實(shí)現(xiàn)的保留語(yǔ)義有助于保持與舊版本語(yǔ)言的向后兼容性,即隨機(jī)迭代順序仍然有效,例如Python 3.5)。“
正如在一些人類語(yǔ)言(例如德語(yǔ))中那樣,用法形成了語(yǔ)言,意志現(xiàn)在已經(jīng)被宣布……在whatsnew36中。
2017-12-15更新:
在發(fā)給python-dev名單的郵件中,Guido van Rossum宣稱:
做到這一點(diǎn)。“Dict保持插入順序”是裁決。謝謝!
因此,dict插入排序的3.6版CPython副作用現(xiàn)在已成為語(yǔ)言規(guī)范的一部分(而不僅僅是一個(gè)實(shí)現(xiàn)細(xì)節(jié))。collections.OrderedDict正如Raymond Hettinger在討論中提醒的那樣,該郵件線程還提供了一些可區(qū)分的設(shè)計(jì)目標(biāo)。
我遇到了同樣的問題,我解決了這個(gè)問題:
WantedOutput =sorted(MyDict,key=lambdax: MyDict[x])
(回答“不可能排序字典”的人沒有讀到這個(gè)問題!事實(shí)上,“我可以對(duì)鍵進(jìn)行排序,但是我怎樣才能根據(jù)這些值進(jìn)行排序?”顯然意味著他想要一個(gè)列表按照它們的值的值排序的鍵)。
請(qǐng)注意訂單沒有被很好地定義(在輸出列表中,具有相同值的鍵將以任意順序)。
這是代碼:
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
結(jié)果如下:
原版的
{'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}
總結(jié)
以上是生活随笔為你收集整理的python3.6字典有序_Python如何按值对字典进行排序?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3.5安装pip_pip和p
- 下一篇: python sklearn 梯度下降法