dict 和 set 的 15 個(gè)經(jīng)典使用例子
你好,我是悅創(chuàng)。最近一直在寫書,估計(jì)會(huì)寫挺長(zhǎng)的。今天來更新一下吧。
今天,學(xué)習(xí)關(guān)于運(yùn)用字典和集合的 15 個(gè)例子。
1. update
實(shí)際使用字典時(shí),需要批量插入鍵值對(duì)到已有字典中,使用 update 方法實(shí)現(xiàn)批量插入。已有字典中批量插入鍵值對(duì):
In[23]: d = {'a': 1, 'b': 2}
# 方法 1
In[24]: d.update({'c': 3, 'd': 4, 'e': 5})
In[25]: d
Out[25]: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# 方法 2
In [31]: d = {'a': 1, 'b': 2}
...: d.update([('c', 3), ('d', 4), ('e', 5)]) # 實(shí)現(xiàn)與方法 1 一樣效果
In [32]: d
Out[32]: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# 方法 3
In [33]: d = {'a': 1, 'b': 2}
...: d.update([('c', 3), ('d', 4)], e=5) # 實(shí)現(xiàn)與方法 1 一樣效果
In [34]: d
Out[34]: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
2. setdefault
如果僅當(dāng)字典中不存在某個(gè)鍵值對(duì)時(shí),才插入到字典中;如果存在,不必插入(也就不會(huì)修改鍵值對(duì))。這種場(chǎng)景,使用字典自帶方法 setdefault:
In [35]: d = {'a': 1, 'b': 2}
In [36]: r = d.setdefault('c', 3) # r: 3
In [37]: r
Out[37]: 3
In [38]: d
Out[38]: {'a': 1, 'b': 2, 'c': 3}
In [39]: r = d.setdefault('c', 33) # r:3,已經(jīng)存在 'c':3 的鍵值對(duì),所以 setdefault 時(shí) d 無改變
In [40]: r
Out[40]: 3
In [41]: d
Out[41]: {'a': 1, 'b': 2, 'c': 3}
3. 字典并集
先來看這個(gè)函數(shù) f,為了好理解,顯示的給出參數(shù)類型、返回值類型,這不是必須的。
In [45]: def f(d: dict) -> dict:
...: return {**d}
...:
In [46]: f({'a':1,'b':2})
Out[46]: {'a': 1, 'b': 2}
{**d1, **d2}實(shí)現(xiàn)合并 d1 和 d2,返回一個(gè)新字典:
In [47]: def merge(d1, d2):
...: return {**d1,**d2}
In [48]: merge({'a': 1, 'b': 2}, {'c': 3})
Out[48]: {'a': 1, 'b': 2, 'c': 3}
以下為示意圖:
4. 字典差
In [51]: def difference(d1, d2):
...: return dict([(k,v) for k,v in d1.items() if k not in d2])
In [53]: difference({'a': 1, 'b': 2, 'c': 3}, {'b': 2})
Out[53]: {'a': 1, 'c': 3}
5. 按鍵排序
In [54]: def sort_by_key(d):
...: return sorted(d.items(), key=lambda x: x[0])
...:
In [55]: sort_by_key({'a': 3, 'b': 1, 'c': 2})
Out[55]: [('a', 3), ('b', 1), ('c', 2)]
sorted 函數(shù)返回列表,元素為 tuple:
6. 按值排序
與按照鍵排序原理相同,按照值排序時(shí),key 函數(shù)定義為按值(x[1])比較。為照顧小白,解釋為什么是 x[1]。d.items() 返回元素為 (key, value) 的可迭代類型(Iterable),key 函數(shù)的參數(shù) x 便是元素 (key, value),所以 x[1] 取到字典的值。
In [59]: def sort_by_value(d):
...: return sorted(d.items(), key=lambda x: x[1])
...:
In [60]: sort_by_value({'a': 3, 'b': 1, 'c': 2})
Out[60]: [('b', 1), ('c', 2), ('a', 3)]
7. 最大鍵
通過 keys 拿到所有鍵,獲取最大鍵,返回(最大鍵, 值)的元組 s
In [68]: def max_key(d):
...: if len(d) == 0:
...: return []
...: max_key = max(d.keys())
...: return (max_key, d[max_key])
In [69]: max_key({'a': 3, 'c': 3, 'b': 2})
Out[69]: ('c', 3)
8. 最大字典值
最大值的字典,可能有多對(duì):
In [70]: def max_key(d):
...: if len(d) == 0:
...: return []
...: max_val = max(d.values())
...: return [(key, max_val) for key in d if d[key] == max_val]
...:
In [71]: max_key({'a': 3, 'c': 3, 'b': 2})
Out[71]: [('a', 3), ('c', 3)]

9. 集合最值
找出集合中的最大、最小值,并裝到元組中返回:
In [76]: def max_min(s):
...: return (max(s), min(s))
In [77]: max_min({1, 3, 5, 7})
Out[77]: (7, 1)
10. 單字符串
若組成字符串的所有字符僅出現(xiàn)一次,則被稱為單字符串。
In [73]: def single(string):
...: return len(set(string)) == len(string)
In [74]: single('love_python') # False
Out[74]: False
In [75]: single('python') # True
Out[75]: True
11. 更長(zhǎng)集合
key 函數(shù)定義為按照元素長(zhǎng)度比較大小,找到更長(zhǎng)的集合:
In [78]: def longer(s1,s2):
...: return max(s1, s2, key=lambda x: len(x))
...:
In [79]: longer({1, 3, 5, 7}, {1, 5, 7}) # {1,3,5,7}
Out[79]: {1, 3, 5, 7}
12. 重復(fù)最多
在兩個(gè)列表中,找出重疊次數(shù)最多的元素。默認(rèn)只返回一個(gè)。解決思路:
求兩個(gè)列表的交集 遍歷交集列表中的每一個(gè)元素,min(元素在列表 1 次數(shù), 元素在列表 2 次數(shù)),就是此元素的重疊次數(shù) 求出最大的重疊次數(shù)
In [80]: def max_overlap(lst1,lst2):
...: overlap = set(lst1).intersection(lst2)
...: ox = [(x, min(lst1.count(x), lst2.count(x))) for x in overlap]
...: return max(ox, key=lambda x: x[1])
In [81]: max_overlap([1, 2, 2, 2, 3, 3], [2, 2, 3, 2, 2, 3])
Out[81]: (2, 3)
以下三個(gè)案例,有些難度,對(duì)于新手,可先跳過。
13. topn 鍵
找出字典前 n 個(gè)最大值,對(duì)應(yīng)的鍵。導(dǎo)入 Python 內(nèi)置模塊 heapq 中的 nlargest 函數(shù),獲取字典中的前 n 個(gè)最大值。key 函數(shù)定義按值比較大小:
In [82]: from heapq import nlargest
In [83]: def topn_dict(d, n):
...: return nlargest(n, d, key=lambda k: d[k])
In [84]: topn_dict({'a': 10, 'b': 8, 'c': 9, 'd': 10}, 3)
Out[84]: ['a', 'd', 'c']
14. 一鍵對(duì)多值字典
一鍵對(duì)多個(gè)值的實(shí)現(xiàn)方法 1,按照常規(guī)思路,循序漸進(jìn):
In [85]: d = {}
...: lst = [(1, 'apple'), (2, 'orange'), (1, 'compute')]
...: for k, v in lst:
...: if k not in d:
...: d[k] = []
...: d[k].append(v)
In [86]: d
Out[86]: {1: ['apple', 'compute'], 2: ['orange']}
以上方法,有一處 if 判斷 ,確認(rèn) k 是不是已經(jīng)在返回結(jié)果字典 d 中。不是很優(yōu)雅!可以使用 collections 模塊中的 defaultdict,它能創(chuàng)建屬于某個(gè)類型的自帶初始值的字典。使用起來更加方便:
In [87]: from collections import defaultdict
...:
...: d = defaultdict(list)
...: for k, v in lst:
...: d[k].append(v)
In [88]: d
Out[88]: defaultdict(list, {1: ['apple', 'compute'], 2: ['orange']})
15. 邏輯上合并字典
案例 3 中合并字典的方法:
In [94]: dic1 = {'x': 1, 'y': 2 }
In [95]: dic2 = {'y': 3, 'z': 4 }
In [96]: merged = {**dic1, **dic2}
In [97]: merged
Out[97]: {'x': 1, 'y': 3, 'z': 4}
修改 merged['x']=10,dic1 中的 x 值不變,merged 是重新生成的一個(gè)“新字典”。
但是,collections 模塊中的 ChainMap 函數(shù)卻不同,它在內(nèi)部創(chuàng)建了一個(gè)容納這些字典的列表。使用 ChainMap 合并字典,修改 merged['x']=10 后,dic1 中的 x 值改變。
如下所示:
In [98]: from collections import ChainMap
In [94]: dic1 = {'x': 1, 'y': 2 }
In [95]: dic2 = {'y': 3, 'z': 4 }
In [99]: merged = ChainMap(dic1,dic2)
In [100]: merged
Out[100]: ChainMap({'x': 1, 'y': 2}, {'y': 3, 'z': 4})
In [101]: merged['x'] = 10
In [102]: dic1 # 改變,共用內(nèi)存的結(jié)果
Out[102]: {'x': 10, 'y': 2}
小結(jié)
今天與大家一起學(xué)習(xí)了字典和集合相關(guān)的 15 個(gè)案例,難度有高有低。比如要區(qū)分邏輯上合并字典,與普通的合并字典,有什么不一樣;key 函數(shù)一般會(huì)與 lambda 匿名函數(shù)結(jié)合使用。經(jīng)過學(xué)習(xí)這些案例,相信會(huì)掌握。仍然建議碼一碼,理解會(huì)更加深刻。
長(zhǎng)按識(shí)別下方二維碼,和眾多位島民一起
把別人的頓悟,變成你的基本功
“AI悅創(chuàng)·推出輔導(dǎo)班啦,包括「Python 語言輔導(dǎo)班、C++輔導(dǎo)班、算法/數(shù)據(jù)結(jié)構(gòu)輔導(dǎo)班、少兒編程、pygame 游戲開發(fā)」,全部都是一對(duì)一教學(xué):一對(duì)一輔導(dǎo) + 一對(duì)一答疑 + 布置作業(yè) + 項(xiàng)目實(shí)踐等。QQ、微信在線,隨時(shí)響應(yīng)!V:Jiabcdefh
”
黃家寶丨AI悅創(chuàng)
隱形字
攝影公眾號(hào)「悅創(chuàng)攝影研習(xí)社」
在這里分享自己的一些經(jīng)驗(yàn)、想法和見解。
長(zhǎng)按識(shí)別二維碼關(guān)注


