日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3.6字典有序_Python如何按值对字典进行排序?

發布時間:2024/1/23 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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如何按值对字典进行排序?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。