深入Python(1): 字典排序 關於sort()、reversed()、sorted()

来源:http://www.cnblogs.com/kungfupanda/archive/2016/01/23/5152759.html
-Advertisement-
Play Games

http://www.cnblogs.com/BeginMan/p/3193081.html一、Python的排序1、reversed()這個很好理解,reversed英文意思就是:adj. 顛倒的;相反的;(判決等)撤銷的print list(reversed(['dream','a','have...


http://www.cnblogs.com/BeginMan/p/3193081.html

 

一、Python的排序

1、reversed()

這個很好理解,reversed英文意思就是:adj. 顛倒的;相反的;(判決等)撤銷的

print list(reversed(['dream','a','have','I']))
#['I', 'have', 'a', 'dream']

2、讓人糊塗的sort()與sorted()

在Python 中sorted是內建函數(BIF),而sort()是列表類型的內建函數list.sort()。

sorted()

sorted(iterable[, cmp[, key[, reverse]]])

Return a new sorted list from the items in iterable.

The optional arguments(可選參數) cmp, key, and reverse have the same meaning as those for the list.sort() method (described in section Mutable Sequence Types).

cmp specifies(指定) a custom comparison function of two arguments (iterable(可迭代的) elements) which should return a negative(複數), zero or positive(正數) number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument: cmp=lambda x,y: cmp(x.lower(), y.lower()). The default value is None.

key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).

reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.

#字元串排序使用是字典序,而非字母序
"""sorted()按照字典序排序"""
lis = ['a','c','z','E','T','C','b','A','Good','Tack']
print sorted(lis)   #['A', 'C', 'E', 'Good', 'T', 'Tack', 'a', 'b', 'c', 'z']

 

關於字典序:

可參考百度百科。http://baike.baidu.com/view/4670107.htm

根據ASCII排,具體如下:
0-9(對應數值48-59);
A-Z(對應數值65-90);
a-z(對應數值97-122);

------------
標準序: 短在前,長在後,等長的依次比字母,
如to < up < cap < cat < too < two <boat < boot < card
字典序: 依次比字母,
如boat < boot <cap < card < cat < to < too< two < up

更有甚者說字典序就是字典的排序,像字典一樣。我一直沒有找到權威的說明,什麼是字典序????求答案!!

sort()

s.sort([cmp[, key[, reverse]]])

 

三、Python的字典排序

1、關於Python字典的一些特征

無序:

字典,形如 dic = {'a':1 , 'b':2 , 'c': 3},字典中的元素沒有順序,所以dic[0]是有語法錯誤的。

無重:

不可以有重覆的鍵值,所以 dic.add['c'] = 4後,字典變成 {'a':1 , 'b':2 , 'c': 4}.

2、根據“鍵”或“鍵值”進行不同順序的排序

函數原型:sorted(dic,value,reverse)

解釋:dic為比較函數,value 為排序的對象(這裡指鍵或鍵值),

reverse:註明升序還是降序,True--降序,False--升序(預設)

3、例子:

dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0}
想把dic的value按照從大到小排序(value都是整數)。

dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0}
print sorted(dic.iteritems(), key=lambda d:d[1], reverse = False )  
#[('d', 0), ('c', 3), ('asd', 4), ('bc', 5), ('a', 31), ('33', 56)]

解釋如下:

(1)、dic.iteritems(),返回字典鍵值對的元祖集合

複製代碼
print dic.iteritems()   #<dictionary-itemiterator object at 0x00B71A80>

for obj in dic.iteritems():
    print obj,obj[0],obj[1]
    
#('a', 31) a 31
#('c', 3) c 3
#('d', 0) d 0
#('bc', 5) bc 5
#('33', 56) 33 56
#('asd', 4) asd 4
複製代碼

(2)、關於排序對象

上述已經說過,value(或key)為排序的對象(這裡指鍵或鍵值),然而為什麼使用lambda函數呢,這裡請參閱:點擊閱讀

key=lambda d:d[1] 是將鍵值(value)作為排序對象。

key = lambda d:d[1]
for i in dic.iteritems():
    print key(i),   #輸出31 3 0 5 56 4,這些都是字典dic的值

如果選擇 key = lambda d:d[0],則選擇【鍵Key】作為排序對象。

(3)、reverse

reverse 是否反向,reverse=Ture表示反向。

(4)、註意:

sorted(dic.iteritems(), key=lambda d:d[1], reverse = False )將每一項dic.iteritems()鍵值對的元祖進行迭代,每一項都作為參數傳入key()函數(我說的是這個:key=lambda d:d[1],)中。

 4、回顧

lis = ['a','bc','c','asd','33','d']
print sorted(lis)   #['33', 'a', 'asd', 'bc', 'c', 'd']
依次比字母, 如boat < boot <cap < card < cat < to < too< two < up

5.問題

具體實例可參考:[**python的排序函數sort,sorted在列表排序和字典排序中的應用詳解和舉例**](http://wangwei007.blog.51cto.com/68019/1100742)

現在有這種情況,排序中排序。如大題號排序,然後大題對應的小題號也排序,如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 lis = [{'Big':3, 'small':2},{'Big':3, 'small':4},{'Big':2, 'small':2}, {'Big':3, 'small':1},{'Big':2, 'small':1},{'Big':1, 'small':1}]   # 大題號排序 li = sorted(lis, key=lambda s: s['Big'])   # 輸出: #[{'small': 1, 'Big': 1}, {'small': 2, 'Big': 2}, {'small': 1, 'Big': 2}, {'small': 2, 'Big': 3}, {'s mall': 4, 'Big': 3}, {'small': 1, 'Big': 3}]   # 小題號排序: sort_ff = [] no = set([i['Big'] for i in li]) for obj in no: li_ = [] for i in ff: if i['Big'] == obj: li_.append(i) l = sorted(li_, key=lambda s: s['small']) for j in l: sort_ff.append(j)   # 輸出結果: [{'small': 1, 'Big': 1}, {'small': 1, 'Big': 2}, {'small': 2, 'Big': 2}, {'small': 1, 'Big': 3}, {'small': 2, 'Big': 3}, {'small': 4, 'Big': 3}]


善用sort() 或 sorted(), a.sort() 已改變其結構,b = a.sort() 是錯誤的寫法! 而 sorted(a, ...)並沒有改變a的結構。

 

======================================

 

    1. #-*- encoding=utf-8 -*-  
    2.   
    3. import operator  
    4. #按字典值排序(預設為升序)  
    5. x = {1:2, 3:4, 4:3, 2:1, 0:0}  
    6. sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))  
    7. print sorted_x  
    8. #[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]  
    9. #如果要降序排序,可以指定reverse=True  
    10. sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1), reverse=True)  
    11. print sorted_x  
    12. #[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]  
    13. #或者直接使用list的reverse方法將sorted_x順序反轉  
    14. #sorted_x.reverse()  
    15.   
    16. #取代方法是,用lambda表達式  
    17. sorted_x = sorted(x.iteritems(), key=lambda x : x[1])  
    18. print sorted_x  
    19. #[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]  
    20. sorted_x = sorted(x.iteritems(), key=lambda x : x[1], reverse=True)  
    21. print sorted_x  
    22. #[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]  
    23.   
    24. #包含字典dict的列表list的排序方法與dict的排序類似,如下:  
    25. x = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]  
    26. sorted_x = sorted(x, key=operator.itemgetter('name'))  
    27. print sorted_x  
    28. #[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]  
    29. sorted_x = sorted(x, key=operator.itemgetter('name'), reverse=True)  
    30. print sorted_x  
    31. #[{'age': 39, 'name': 'Homer'}, {'age': 10, 'name': 'Bart'}]  
    32. sorted_x = sorted(x, key=lambda x : x['name'])  
    33. print sorted_x  
    34. #[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]  
    35. sorted_x = sorted(x, key=lambda x : x['name'], reverse=True)  
    36. print sorted_x  
    37. #[{'age': 39, 'name': 'Homer'}, {'age': 10, 'name': 'Bart'}] 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用 Python 做一件很平常的事情: 打開文件, 逐行讀入, 最後關掉文件; 進一步的需求是, 這也許是程式中一個可選的功能, 如果有任何問題, 比如文件無法打開, 或是讀取出錯, 那麼在函數內需要捕獲所有異常, 輸出一行警告並退出. 代碼可能一開始看起來是這樣的?12345678def read...
  • 我們思考發佈一個web服務需要做的工作,併進行職責的劃分。
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】A 代碼生成器(開發利器);全部是源碼 增刪改查的處理類,service層,mybatis的xml,SQL( mysql 和oracle)腳本, jsp頁面 都生成 就不用寫搬磚的代碼了,生成的放到項目里,可以直接運行B 阿裡巴巴資料庫連...
  • 從一個C++菜鳥改函數開始1 CString MyClass::GetStringValue() const2 {3 return m_strValue; 4 }這個值可能還沒有賦值,好吧,那麼我先判斷是不是為空,為空就賦值了CString MyClass::GetStringValue(...
  • 這裡提供一個最簡單的Web Service的實現,基於JAX-WS。除了jdk不需要任何其他jar包,使用Eclipse提供的Web Services Explorer訪問服務。
  • 剛開始調用微信小店api的時候,可能大家會遇到問題。系統總是提示system error,歸根結底還是發送的參數不正確。下麵給出幾個調用例子:例子寫得不全。AccessToken); $ResData = cUrlRequest($url,'{"status": '.$st...
  • 大一下學期的自我目標(要求包含對大一上學期的總結、對面向對象課程完成後學習到的能力的預期,對面向對象課程的期望、對編程和專業能力的願景規劃)在大學的第一個學期,相信很多人都是在得過且過度過,我也不例外。比起學習,對於宅男們來說游戲更是一種打發時間的好手段。好吧,轉入正題:對大一上學期的總結,其實還是...
  • 簡單寫了一個PHP的圖像處理類庫,雖然功能比較少,但是目前也沒用到太高級的,以後用到了再填吧,或者哪位給點建議加上什麼功能,或者有什麼需求可以跟我說,我有時間加上,如果哪位對這個類庫進行了擴展的話,還麻煩拿出來大家分享一下,代碼現在是能用就行,考慮的東西不是很多,有什麼更好的建議請告訴我,謝謝Img...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...