<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          dict 和 set 的 15 個(gè)經(jīng)典使用例子

          共 9422字,需瀏覽 19分鐘

           ·

          2022-05-12 18:23

          你好,我是悅創(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)]
          image.png

          9. 集合最值

          找出集合中的最大、最小值,并裝到元組中返回:

          In [76]: def max_min(s):
              ...:     return (max(s), min(s))

          In [77]: max_min({1357}) 
          Out[77]: (71)

          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({1357}, {157})  # {1,3,5,7}
          Out[79]: {1357}

          12. 重復(fù)最多

          在兩個(gè)列表中,找出重疊次數(shù)最多的元素。默認(rèn)只返回一個(gè)。解決思路:

          1. 求兩個(gè)列表的交集
          2. 遍歷交集列表中的每一個(gè)元素,min(元素在列表 1 次數(shù), 元素在列表 2 次數(shù)),就是此元素的重疊次數(shù)
          3. 求出最大的重疊次數(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([122233], [223223])
          Out[81]: (23)

          以下三個(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)
          排版:AI悅創(chuàng)





          黃家寶丨AI悅創(chuàng)

          隱形字

          攝影公眾號(hào)「悅創(chuàng)攝影研習(xí)社」


          在這里分享自己的一些經(jīng)驗(yàn)、想法和見解。


          長(zhǎng)按識(shí)別二維碼關(guān)注




          好文和朋友一起看~
          瀏覽 37
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲家庭乱轮五月天 | 一区二区三区未删减 | 逼视频免费 | 人妻水蜜桃 | 久久久久久久视频 |