知乎上有人說,python3.6以後字典有序且更高效了。群裡有同學推薦了這篇文章
(給我看,並諮詢字典排序的問題。大致瀏覽了一下,我當即表示不能認同這個說法。這篇文章的作者,應該是一位資深的專業人士,對於python直譯器如何實現字典儲存和檢索有著深刻的理解。但他犯了一明顯的常識性錯誤:在邏輯上,字典是資料的無序集合,僅依賴於鍵檢索。我們說字典是無序,不是指字典在物理實體上實現的時候真的無序,而是指它的順序對使用者而言沒有明確的界定,不能作為資料的特性使用。知乎上這篇文章講的字典有序,是指字典在物理實體上實現時的有序,而非邏輯上的有序。既然字典是無序的,為什麼還有那麼多討論字典排序的話題呢?其實,在py2時代,就存在有序字典(orderdict),但有序字典和我們討論的字典,並非一碼事兒。所謂的字典排序,實質上是根據排序規則將字典的鍵排序,得到的排序結果是乙個列表。我們用乙個例子來演示一下字典排序:roster是乙個儲存學生資訊的字典,請按照女生優先、低年級在前、總成績從高到低排序;如果總成績相同,則順序比較語文、數學、英語成績,高者在前。
roster = ,
'鄔勝傑': ,
'白星瑤': ,
'吳詩涵': ,
'莊嘉順':
}
python最常用的排序函式是sorted(),我們就用sorted()來實現這個排序。如果一次寫出復合排序條件,有一定難度。我們化繁為簡,一步步實現。>>> sorted(roster, key=lambda name:roster[name]['語文']+roster[name]['數學']+roster[name]['英語'])
['吳詩涵', '鄔勝傑', '莊嘉順', '李妍可', '白星瑤']
看起來沒有問題,但sorted預設是公升序,總成績從高到低排序的話,要使用reverse=true這個引數。>>> sorted(roster, key=lambda name:roster[name]['語文']+roster[name]['數學']+roster[name]['英語'], reverse=true)
['白星瑤', '李妍可', '鄔勝傑', '莊嘉順', '吳詩涵']
只要在lambda函式中,把排序項並列寫出來,sorted()就會自動實現符合條件排序。這裡性別排序的條件是'性別'=='男',對女生而言,結果是false(0),小於男生的true(1),自然就排在了前面。>>> sorted(roster, key=lambda name:(roster[name]['性別']=='男',roster[name]['年級']))
['白星瑤', '李妍可', '吳詩涵', '鄔勝傑', '莊嘉順']
嘗試了單個條件和兩個條件的排序之後,實現本題目的最終要求就很容易了。不過,成績降序排列的話,不能直接使用reverse=true,因為會影響性別和年級的排序。我們可以稍微變通一下,達到最終的目的。>>> sorted(roster, key=lambda name:(
roster[name]['性別']=='男',
roster[name]['年級'],
300-roster[name]['語文']-roster[name]['數學']-roster[name]['英語'],
100-roster[name]['語文'],
100-roster[name]['數學'],
100-roster[name]['英語']
))['白星瑤', '李妍可', '吳詩涵', '莊嘉順', '鄔勝傑']
齊活兒!
Python dictionary字典的複製方法
dict2 dict1 第一種你想到的複製方法 dict1 dict2 dict1 dict1 a 2 dict2 原因 設想是乙個物件 型別是詞典的物件 dict2 dict1,不過是這個物件的不同名字而已,因此並不是複製。dict2 dict1.copy or dict2.update dict...
抓取貓眼電影前100
import json import requests import re import time from requests.exceptions import requestexception def get one page url try headers response requests....
選取重複頻率最高前k個數
在乙個無序的整數陣列中選取重複頻率最高的前k個數,例如 整數陣列 3,4,5,6,4,3,5,2,3 k 3,則結果集為 3,5,4 第一種方法暴力解法 對所有數的頻率進行統計,然後用排序演算法進行排序找出前k個頻率最高的數。如果我們按相對來說最優的排序演算法快速排序來進行查詢,快速排序 如下 pu...