欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python字典高級用法深入分析講解

 更新時間:2022年10月12日 16:02:25   作者:Python熱愛者  
字典作為Python的一個內(nèi)置數(shù)據(jù)結(jié)構(gòu),和列表一樣都是可變序列的,但是它是無序的,以鍵值對的方式存儲數(shù)據(jù)。本文將詳解一下Python中字典的高級使用,需要的可以參考一下

一、 collections 中 defaultdict 的使用

1.字典的鍵映射多個值

將下面的列表轉(zhuǎn)成字典

l = [('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]

一個字典就是一個鍵對應(yīng)一個單值的映射,而上面的列表中有相同鍵。如果你想要一個鍵映射多個值,那么就需要將這多個值放到另外的序列中,比如 list 或者 set 里面,像下面這樣:

d = {
    'a': [1, 2, 3],
    'b': [4, 5]
}
e = {
    'a': {1, 2, 3},
    'b': {4, 5}
}

你可以很方便的使用 collections 模塊中的 defaultdict 來構(gòu)造這樣的字典。 defaultdict 的一個特征是它會自動初始化每個 key 剛開始對應(yīng)的值。

In [1]: l = [('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]
In [2]: from collections import defaultdict
In [3]: d = defaultdict(list)
In [4]: for key, value in l:
   ...:     d[key].append(value)
   ...: 
In [5]: d
Out[5]: defaultdict(list, {'a': [2, 1, 3, 1], 'b': [3, 4, 3]})

當(dāng)然這個默認的容器不一定是 list, 也可以是集合 set。根據(jù)自己的需求選擇用 list 還是 set 。如果你想保持元素的插入順序就應(yīng)該使用列表,如果想去掉重復(fù)元素就使用集合!

2.統(tǒng)計字典中某個值出現(xiàn)的次數(shù)

來源于微信交流群里一個朋友工作中的問題,列表中有很多字典,需要統(tǒng)計字典中相同的鍵對應(yīng)的值的和

利用 defaultdict 設(shè)置默認值的方法 defaultdict(int),代碼如下:

In [6]: d = defaultdict(int)
In [7]: objs = [{'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}]
In [8]: for obj in objs:
   ...:     for key,value in obj.items():
   ...:         d[key] += value
   ...: 
In [9]: d
Out[9]: defaultdict(int, {'F29958SVDK6': 60})

二、collections 創(chuàng)建有序字典

字典dict是無序的,如果我們想要有序的dict,可以使用OrdereDict 。示例如下:

In [11]: from collections import OrderedDict
In [12]: d = OrderedDict()
In [13]: d['bar'] = 2
In [14]: d['non'] = 8
In [15]: d['sek'] = 5
In [16]: d
Out[17]: OrderedDict([('bar', 2), ('non', 8), ('sek', 5)])

OrderedDict 內(nèi)部維護著一個根據(jù)鍵插入順序排序的雙向鏈表。每次當(dāng)一個新的元 素插入進來的時候,它會被放到鏈表的尾部。對于一個已經(jīng)存在的鍵的重復(fù)賦值不會 改變鍵的順序。

需要注意的是,一個 OrderedDict 的大小是一個普通字典的兩倍,因為它內(nèi)部維 護著另外一個鏈表。所以如果你要構(gòu)建一個需要大量 OrderedDict 實例的數(shù)據(jù)結(jié)構(gòu)的 時候 (比如讀取 100,000 行 CSV 數(shù)據(jù)到一個 OrderedDict 列表中去),那么你就得仔細權(quán)衡一下是否使用 OrderedDict 帶來的好處要大過額外內(nèi)存消耗的影響。

1.改變 key-value 的順序

OrderedDict 是有序的字典,同時也能改變其順序。比如我們想要改變有序的 OrderedDict 對象的 key-value 順序,可以使用 move_to_end(key)。還是以上面創(chuàng)建的有序字典為例子

In [18]: d.move_to_end("bar")
In [20]: d
Out[20]: OrderedDict([('non', 8), ('sek', 5), ('bar', 2)])

可以看到之前排在第一位的 bar被移到最后一位了。move_to_end 還接收一個關(guān)鍵字參數(shù) last。last 默認為 True,當(dāng) last = False 的時候,表示將該鍵移動到最前面!

2.刪除 key_value

如果我們要刪除有序字典中的 key-value, 可以使用 popitem 方法, popitem(last=True) 按照先進后出的順序刪除 dict中 的 key-value,popitem(last=False) 按照先進先出的規(guī)則刪除 dict 中的 key-value。

In [42]: d
Out[42]: OrderedDict([('bar', 2), ('non', 8), ('sek', 5)])
In [43]: d.popitem(last=False)
Out[43]: ('bar', 2)
In [44]: d
Out[44]: OrderedDict([('non', 8), ('sek', 5)])

三、字典排序

利用Python 內(nèi)置函數(shù) sorted 對字典的鍵或者值進行排序,首先來了解下 sorted 函數(shù)

sorted(iterable, key=None, reverse=False)

參數(shù)說明:

  • iterable – 可迭代對象
  • key – 主要是用來進行比較的元素,只有一個參數(shù),具體的函數(shù)的參數(shù)就是取自于可迭代對象中,指定可迭代對象中的一個元素來進行排序。
  • reverse – 排序規(guī)則,reverse = True 降序 , reverse = False 升序(默認)。

1.按照 key 進行排序

理解了 sorted 函數(shù)就好辦了,代碼如下:

In [55]: d = {'b':3,'a':4,'c':2,'d':1}
In [57]: d.items()
Out[57]: dict_items([('b', 3), ('a', 4), ('c', 2), ('d', 1)])
In [58]: sorted(d.items(), key=lambda i:i[0])
Out[58]: [('a', 4), ('b', 3), ('c', 2), ('d', 1)]

2.按照 value 進行排序

代碼如下:

In [59]: sorted(d.items(), key=lambda i:i[1])
Out[59]: [('d', 1), ('c', 2), ('b', 3), ('a', 4)]

注意排序后的返回值是一個list,而原字典中的名值對被轉(zhuǎn)換為了list中的元組。

四、通過某個關(guān)鍵字排序一個字典列表

假設(shè)你有一個字典列表, 如下:

rows = [ {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
 {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
 {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}, 
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004} ] 

你想根據(jù)某個或某幾個字典字段來排序這個列表。

通過使用 operator 模塊的 itemgetter 函數(shù),可以非常容易的排序這樣的數(shù)據(jù)結(jié)構(gòu),代碼如下:

In [46]: from operator import itemgetter
In [47]: rows_by_fname = sorted(rows, key=itemgetter('fname'))
In [48]: rows_by_fname
Out[48]: 
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
 {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
 {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
 {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
In [49]: rows_by_uid = sorted(rows, key=itemgetter('uid'))
In [50]: rows_by_uid
Out[50]: 
[{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
 {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
 {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
 {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]

itemgetter() 函數(shù)也支持多個 keys,比如下面的代碼:

In [52]: rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))
In [53]: rows_by_fname
Out[53]: 
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
 {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
 {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
 {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]

到此這篇關(guān)于Python字典高級用法深入分析講解的文章就介紹到這了,更多相關(guān)Python字典 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python函數(shù)enumerate,operator和Counter使用技巧實例小結(jié)

    python函數(shù)enumerate,operator和Counter使用技巧實例小結(jié)

    這篇文章主要介紹了python函數(shù)enumerate,operator和Counter使用技巧,結(jié)合實例形式總結(jié)分析了python內(nèi)置函數(shù)enumerate,operator和Counter基本功能、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-02-02
  • Python+AutoIt實現(xiàn)界面工具開發(fā)過程詳解

    Python+AutoIt實現(xiàn)界面工具開發(fā)過程詳解

    這篇文章主要介紹了Python+AutoIt實現(xiàn)界面工具開發(fā)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • python防止程序超時的實現(xiàn)示例

    python防止程序超時的實現(xiàn)示例

    因為某個需求,需要在程序運行的時候防止超時,本文主要介紹了python防止程序超時的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 你還在@微信官方?聊聊Python生成你想要的微信頭像

    你還在@微信官方?聊聊Python生成你想要的微信頭像

    這篇文章主要介紹了你還在@微信官方?我來教你用Python生成你想要的微信頭像功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • python批量處理多DNS多域名的nslookup解析實現(xiàn)

    python批量處理多DNS多域名的nslookup解析實現(xiàn)

    這篇文章主要介紹了python批量處理多DNS多域名的nslookup解析實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python繪圖實現(xiàn)坐標(biāo)軸共享與復(fù)用詳解

    Python繪圖實現(xiàn)坐標(biāo)軸共享與復(fù)用詳解

    這篇文章主要為大家詳細介紹了Python在繪圖時如何實現(xiàn)坐標(biāo)軸共享與復(fù)用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • pandas參數(shù)設(shè)置的實用小技巧

    pandas參數(shù)設(shè)置的實用小技巧

    這篇文章主要給大家介紹了關(guān)于pandas參數(shù)設(shè)置的實用小技巧,文中通過實例代碼結(jié)束的非常詳細,對大家學(xué)習(xí)或者使用pandas具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法)完整實例

    Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法)完整實例

    這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法),結(jié)合完整實例形式分析了Python圖的最短路徑算法相關(guān)原理與實現(xiàn)技巧,需要的朋友可以參考下
    2017-12-12
  • Python 集合之set詳解

    Python 集合之set詳解

    這篇文章主要介紹了python基礎(chǔ)之set集合詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-09-09
  • pandas將多個dataframe以多個sheet的形式保存到一個excel文件中

    pandas將多個dataframe以多個sheet的形式保存到一個excel文件中

    這篇文章主要介紹了pandas將多個dataframe以多個sheet的形式保存到一個excel文件中,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評論