Python字典里的5個黑魔法
原創(chuàng)?xinxin?菜鳥學(xué)Python?
閱讀本文大概需要5.8 分鐘
Python里面有3大數(shù)據(jù)結(jié)構(gòu):列表,字典和集合.字典是常用的數(shù)據(jù)結(jié)構(gòu),里面有一些重要的技巧用法,我把這些都整理到一起,熟練掌握這些技巧之后拖陆,對自己的功力大有幫助.
1.字典的排序:
用萬金油sorted()函數(shù)
舉一個簡單的例子
? ?my_dict={"cc":100,"aa":200,"bb":10}
print(sorted(my_dict.iteritems(),key=lambda x:x[0]))#表示按照key排序
>>>[('aa', 200), ('bb', 10), ('cc', 100)]
print(sorted(my_dict.iteritems(),key=lambda x:x[1]))#表示按照value排序
>>>[('bb', 10), ('cc', 100), ('aa', 200)]
注意原始的my_dict本身順序并沒有變(不信你可以print看看),排序是通過sorted()返回了一個新的字典
另外一種做法,因為字典是無序,若你一開始設(shè)計的時候就希望這個數(shù)據(jù)結(jié)構(gòu),按照的添加的順序進行有序排列(比如讀取CSV文件)栗涂,那么我們就是利用collection模塊里面的OrderedDict()處理:
from collections import OrderedDict
orderDict=OrderedDict()
orderDict['a']=1
orderDict['b']=2
orderDict['c']=3
print(orderDict)
>>>OrderedDict([('a', 1), ('b', 2), ('c', 3)])
對比一下,若是普通的dict是亂序的祈争,若不用OrderedDict()
orderDict=dict()
orderDict['a']=1
orderDict['b']=2
orderDict['c']=3
print(orderDict)
>>>{'a': 1, 'c': 3, 'b': 2}
最后要提醒一下:OrderedDict()雖然是好東西斤程,但是它內(nèi)部維護了一個雙向鏈表,若數(shù)據(jù)量很大的話,會非常消耗內(nèi)存.
2.字典的取值
字典中取值大家很容易想到用dict[key],這個有什么難的菩混,確實一般取值是這樣的,但是你有沒有想過若你取的值不存在忿墅,就會發(fā)生異常,風(fēng)險很大.(良好的代碼,一定是要考慮健壯性,切記)
因為試圖通過索引的方式去取值,比如dict[key],當(dāng)key不是字典dict的鍵沮峡,會引起異常疚脐,有沒有什么兩全的辦法有值的時候取值,沒有值的時候即使我取不到也不會發(fā)生異常
答案是有的邢疙,python早就給你準(zhǔn)備好了.我們用dict.get()
建議:盡量用dict.get()來代替dict[key]
3.字典中提取部分子集
我們原來有一個長的字典棍弄,我們想提取其中一部分變成另外一個子集,我們怎么做呢,我們來看一個小例子:
students_score={'jack':80,'james':91,'leo':100,'sam':60}
#提取分數(shù)超過90分的學(xué)生信息疟游,并變成字典
我們可以用字典推導(dǎo)式呼畸,輕松搞定
good_score={name:score for name,score in students_score.items() if score>90}
print(good_score)
>>>{'james': 91, 'leo': 100}
4.字典的計算
比如我們有一個字典是記錄股票的價格呢,一般key都是股票的名字,而value是價格颁虐,若我們想對價格進行計算役耕,應(yīng)該如何處理呢,我們還是通過實例來講解:
下面是一個股票價格的字典,我們希望得到里面的最大值聪廉,最小值
stocks={'wanke':25.6,'wuliangye':32.3,'maotai':299.5,'huatai':18.6}
一般有幾種方法:
利用字典的values():
利用神奇的zip()進行翻轉(zhuǎn)(zip詳細用法我前面的文章里面經(jīng)過瞬痘,可以從歷史文章里面找一下)
是不是對python的用法嘆為觀止故慈,太神奇了,內(nèi)置了這么多方便的用法框全,若用c++,java處理這些問題要好幾倍的代碼.
5.字典的翻轉(zhuǎn)
在處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的時候察绷,有的時候希望把字典翻轉(zhuǎn),一般用推導(dǎo)列表進行過渡,然后再用dict()函數(shù)編程字典
若碰到比較大的字典津辩,數(shù)據(jù)量很多很長的時候拆撼,最好用Python標(biāo)準(zhǔn)庫里的itertools模塊(順便說一下,這個模塊非常有用,大家可以關(guān)注一下)
from itertools import izip
invert_stocks2=dict(izip(stocks.itervalues(),stocks.iterkeys()))
print(invert_stocks2)