Python字典里的5個黑魔法

來自微信公共號:菜鳥學python

Python裡面有3大數據結構:列表,字典和集合.字典是常用的數據結構,裡面有一些重要的技巧用法,我把這些都整理到一起,熟練掌握這些技巧之後,對自己的功力大有幫助.

1.字典的排序:

用萬金油sorted()函數

  • 舉一個簡單的例子

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()返回了一個新的字典

  • 另外一種做法,因為字典是無序,若你一開始設計的時候就希望這個數據結構,按照的添加的順序進行有序排列(比如讀取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()雖然是好東西,但是它內部維護了一個雙向鏈表,若數據量很大的話,會非常消耗內存.

2.字典的取值

字典中取值大家很容易想到用dict[key],這個有什麼難的,確實一般取值是這樣的,但是你有沒有想過若你取的值不存在,就會發生異常,風險很大.(良好的代碼,一定是要考慮健壯性,切記)

因為試圖通過索引的方式去取值,比如dict[key],當key不是字典dict的鍵,會引起異常,有沒有什麼兩全的辦法有值的時候取值,沒有值的時候即使我取不到也不會發生異常

答案是有的,python早就給你準備好了.我們用dict.get()

建議:盡量用dict.get()來代替dict[key]

3.字典中提取部分子集

我們原來有一個長的字典,我們想提取其中一部分變成另外一個子集,我們怎麼做呢,我們來看一個小例子:

students_score={jack:80,james:91,leo:100,sam:60}

#提取分數超過90分的學生信息,並變成字典

我們可以用字典推導式,輕鬆搞定

good_score={name:score for name,score in students_score.items() if score>90}

print(good_score)

>>>{james: 91, leo: 100}

4.字典的計算

比如我們有一個字典是記錄股票的價格呢,一般key都是股票的名字,而value是價格,若我們想對價格進行計算,應該如何處理呢,我們還是通過實例來講解:

下面是一個股票價格的字典,我們希望得到裡面的最大值,最小值

stocks={wanke:25.6,wuliangye:32.3,maotai:299.5,huatai:18.6}

一般有幾種方法:

  • 利用字典的values():

  • 利用神奇的zip()進行翻轉(zip詳細用法我前面的文章裡面經過,可以從歷史文章裡面找一下)

是不是對python的用法嘆為觀止,太神奇了,內置了這麼多方便的用法,若用c++,java處理這些問題要好幾倍的代碼.

5.字典的翻轉

在處理複雜的數據結構的時候,有的時候希望把字典翻轉,一般用推導列表進行過渡,然後再用dict()函數編程字典:

若碰到比較大的字典,數據量很多很長的時候,最好用Python標準庫里的itertools模塊(順便說一下,這個模塊非常有用,大家可以關注一下)

from itertools import izip

invert_stocks2=dict(izip(stocks.itervalues(),stocks.iterkeys()))

print(invert_stocks2)

以上就是對Python字典的一些技巧總結和自己的感悟,希望我寫的對大家有一點點幫助,能給大家在日常使用python中能提高一些技巧,也不枉我大半夜碼這麼多字。

最後說一下,原創不易,希望大家能夠給點支持,歡迎轉發,留言,也是對我的一點鼓勵和動力.

也歡迎更多喜歡Python的同學關注 菜鳥學python,一起來學python吧 長按下方的二維碼即可關注.

推薦閱讀:

Github上同學總結的機器學習和deeplearning方面的很全的資料
ruby和python該學那一個?
厲害了word哥,互動式實時監控調整python程序執行!
Python __slots__ 詳解
Python 詞雲分析周杰倫《晴天》

TAG:Python | Python框架 | Python開發 |