<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
將下面的列表轉成字典
l = [('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]
一個字典就是一個鍵對應一個單值的對映,而上面的列表中有相同鍵。如果你想要一個鍵對映多個值,那麼就需要將這多個值放到另外的序列中,比如 list 或者 set 裡面,像下面這樣:
d = { 'a': [1, 2, 3], 'b': [4, 5] } e = { 'a': {1, 2, 3}, 'b': {4, 5} }
你可以很方便的使用 collections 模組中的 defaultdict 來構造這樣的字典。 defaultdict 的一個特徵是它會自動初始化每個 key 剛開始對應的值。
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]})
當然這個預設的容器不一定是 list, 也可以是集合 set。根據自己的需求選擇用 list 還是 set 。如果你想保持元素的插入順序就應該使用列表,如果想去掉重複元素就使用集合!
來源於微信交流群裡一個朋友工作中的問題,列表中有很多字典,需要統計字典中相同的鍵對應的值的和
利用 defaultdict 設定預設值的方法 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})
字典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 內部維護著一個根據鍵插入順序排序的雙向連結串列。每次當一個新的元 素插入進來的時候,它會被放到連結串列的尾部。對於一個已經存在的鍵的重複賦值不會 改變鍵的順序。
需要注意的是,一個 OrderedDict 的大小是一個普通字典的兩倍,因為它內部維 護著另外一個連結串列。所以如果你要構建一個需要大量 OrderedDict 範例的資料結構的 時候 (比如讀取 100,000 行 CSV 資料到一個 OrderedDict 列表中去),那麼你就得仔細權衡一下是否使用 OrderedDict 帶來的好處要大過額外記憶體消耗的影響。
OrderedDict 是有序的字典,同時也能改變其順序。比如我們想要改變有序的 OrderedDict 物件的 key-value 順序,可以使用 move_to_end(key)
。還是以上面建立的有序字典為例子
In [18]: d.move_to_end("bar") In [20]: d Out[20]: OrderedDict([('non', 8), ('sek', 5), ('bar', 2)])
可以看到之前排在第一位的 bar被移到最後一位了。move_to_end
還接收一個關鍵字引數 last。last 預設為 True,當 last = False 的時候,表示將該鍵移動到最前面!
如果我們要刪除有序字典中的 key-value, 可以使用 popitem 方法, popitem(last=True) 按照先進後出的順序刪除 dict中 的 key-value,popitem(last=False) 按照先進先出的規則刪除 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 內建函數 sorted 對字典的鍵或者值進行排序,首先來了解下 sorted 函數
sorted(iterable, key=None, reverse=False)
引數說明:
理解了 sorted 函數就好辦了,程式碼如下:
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)]
程式碼如下:
In [59]: sorted(d.items(), key=lambda i:i[1]) Out[59]: [('d', 1), ('c', 2), ('b', 3), ('a', 4)]
注意排序後的返回值是一個list,而原字典中的名值對被轉換為了list中的元組。
假設你有一個字典列表, 如下:
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} ]
你想根據某個或某幾個字典欄位來排序這個列表。
通過使用 operator 模組的 itemgetter 函數,可以非常容易的排序這樣的資料結構,程式碼如下:
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() 函數也支援多個 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}]
到此這篇關於Python字典高階用法深入分析講解的文章就介紹到這了,更多相關Python字典 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45