python(46):對字典進行排序,多鍵值排序


字典,形如 dic = {'a':1 , 'b':2 , 'c': 3},字典中的元素沒有順序,所以dic[0]是有語法錯誤的。並且不可以有重復的鍵值,所以 dic.add['c'] = 4后,字典變成 {'a':1 , 'b':2 , 'c': 4}.

 

待解決問題

如何根據需要可以根據“鍵”或“鍵值”進行不同順序的排序?

函數原型

sorted(dic,value,reverse)

  • dic為比較函數,value 為排序的對象(這里指鍵或鍵值),
  • reverse:注明升序還是降序,True--降序,False--升序(默認)

案例1

dic = {'a':3 , 'b':2 , 'c': 1}

    

注意

排序之后原字典沒有變,順序依舊

     

案例2

 

>>> a_dic = {'a':{'val':3}, 'b':{'val':4}, 'c':{'val':1}}
>>> dict= sorted(a_dic.iteritems(), key=lambda d:d[1]['val'], reverse = True)
>>> dict
[('b', {'val': 4}), ('a', {'val': 3}), ('c', {'val': 1})]

 

例子中“鍵-值”對中的值是字典,例子對其進行排序。

那如果“鍵值”對中值字典的某一特定鍵不存在,咋處理呢,參考

>>> a = {'a':{'val':3}, 'b':{'val':4}, 'c':{'val':1}, 'd':{'val2':0}}
>>> a
{'a': {'val': 3}, 'c': {'val': 1}, 'b': {'val': 4}, 'd': {'val2': 0}}
>>> dict= sorted(a.iteritems(), key=lambda d:d[1]['val'], reverse = True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
KeyError: 'val'
>>> dict= sorted(a.iteritems(), key=lambda d:d[1].get('val',0), reverse = True)
>>> dict
[('b', {'val': 4}), ('a', {'val': 3}), ('c', {'val': 1}), ('d', {'val2': 0})]

案例3:按照多個鍵值進行排序

先按照cpu,然后按照money

a = {'flavor15': {'cpu': '2', 'memory': 4}, 'flavor14': {'cpu': '2', 'memory': 2}, 'flavor8': {'cpu': '1', 'memory': 1}, 'flavor13': {'cpu': '1', 'memory': 4}, 'flavor12': {'cpu': 2, 'memory': 2}}
mm = sorted(a.items(),key=lambda item:(int(item[1]["cpu"]), int(item[1]["memory"])),reverse=True)
sorted:
[('flavor15', {'cpu': '2', 'memory': 4}), ('flavor14', {'cpu': '2', 'memory': 2}), ('flavor12', {'cpu': 2, 'memory': 2}), ('flavor13', {'cpu': '1', 'memory': 4}), ('flavor8', {'cpu': '1', 'memory': 1})]

兩個函數

1.lambda

功能: 創建匿名函數

區別: 和def函數定義,以下兩點區別

  • lambda會創建一個函數對象,但不會把這個函數對象賦給一個標識符;而def則會把函數對象賦值給一個變量
  • lambda它只是一個表達式,而def則是一個語句

案例:

    

2.iteritems()

功能: iteritems()以迭代器對象返回字典鍵值對

區別: 和item相比:items以列表形式返回字典鍵值對

案例:

    

注釋: 在函數sorted(dic.iteritems(), key = lambda asd:asd[1])中,第一個參數傳給第二個參數“鍵-鍵值”,第二個參數取出其中的鍵([0])或鍵值(1])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM