<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>

          Python字典:竟還有我不會的高階玩法?

          共 3183字,需瀏覽 7分鐘

           ·

          2022-03-17 02:14

          ↑?關注 + 星標?,每天學Python新技能

          后臺回復【大禮包】送你Python自學大禮包

          我經(jīng)常遇到各種五花八門的關于Python字典的操作,今天就在這個文章中展示一些常見操作的優(yōu)化實現(xiàn)方式,如果你都已經(jīng)掌握,那么恭喜你,你已經(jīng)超越了90%以上的Python coder。

          通過序列生成字典

          我們將下面的序列轉(zhuǎn)換為dict類型。

          lst?=?[('a',?1),?('b',?2),?('c',?3)]

          普通的寫法

          for?k,?v?in?lst:
          ????dic[k]?=?v

          pythonic的寫法

          利用字典推導式快速生成字典。

          {k:?v?for?k,?v?in?lst}

          key的默認值

          當指定key不存在時,將value設置為 0。

          普通的寫法

          if?key?not?in?dct:
          ????dct[key]?=?0

          pythonic的寫法

          dct[key]?=?dct.get(key,?0)

          交換key與value

          普通的寫法

          dic?=?{'Python':?1,?'Java':?2}
          new_dic?=?{}
          for?k,?v?in?dic.items():
          ????new_dic[v]?=?k

          pythonic的寫法

          dic?=?{'Python':?1,?'Java':?2}
          new_dic?=?{v:?k?for?k,?v?in?dic.items()}

          序列修改和初始化

          示例數(shù)據(jù)

          lst?=?[('a',?1),?('b',?2),?('c',?3)]
          dic?=?{'a':?[0]}

          如果我們需要根據(jù)lst來更新dic中的數(shù)據(jù),當key存在,則將value添加到原序列末尾,否則初始化value并用序列保存。

          普通的寫法

          for?key,?value?in?lst:
          ????if?key?in?dic:
          ????????dic[key].append(value)
          ????else:
          ????????dic[key]?=?[value]

          pythonic的寫法

          for?(key,?value)?in?lst:
          ????group?=?dic.setdefault(key,?[])
          ????group.append(value)
          # dic:{'a':?[0, 1], 'b':?[2], 'c':?[3]}

          setdefault(key, default)會先判斷key是否存在,存在則返回dct[key] , 不存在則把dct[key]設為 [] 并返回。

          key,items的集合運算

          如果我們現(xiàn)在需要獲取兩個字典的key相交的部分的映射信息。

          普通的寫法

          dic1?=?{'Python':?1,?'Java':?2,?'C':?3}
          dic2?=?{'Python':?3,?'Java':?2,?'C++':?1}

          new_dic?=?{}
          for?k,?v?in?dic1.items():
          ????if?k?in?dic2.keys():
          ????????new_dic[k]?=?v
          print(new_dic)

          #?{'Python':?1,?'Java':?2}

          pythonic的寫法

          dic1?=?{'Python':?1,?'Java':?2,?'C':?3}
          dic2?=?{'Python':?3,?'Java':?2,?'C++':?1}

          print({k:?dic1[k]?for?k?in?dic1.keys()?&?dic2.keys()})

          #?{'Python':?1,?'Java':?2}

          這里的dic1.keys() & dic2.keys()用到的就是 keys()進行集合運算,items()同樣可以進行集合運算。

          如果現(xiàn)在我們要獲取兩個字典中 key,value 完全相同的部分。

          dic1?=?{'Python':?1,?'Java':?2,?'C':?3}
          dic2?=?{'Python':?3,?'Java':?2,?'C++':?1}

          print(dic1.items()?&?dic2.items())

          #?{('Java',?2)}

          靈活運用 keys,items() 集合運算的特性,可以快速提取我們想要的內(nèi)容。

          按key或value對字典排序

          使用sorted()函數(shù)快速實現(xiàn)對keyvalue的排序。

          dic?=?{'a':?2,?'b':?1,?'c':?3,?'d':?0}
          lst1?=?sorted(dic.items(),?key=lambda?x:?x[0],?reverse=False)
          #?[('a',?2),?('b',?1),?('c',?3),?('d',?0)]
          lst2?=?sorted(dic.items(),?key=lambda?x:?x[1],?reverse=False)
          #?[('d',?0),?('b',?1),?('a',?2),?('c',?3)]
          print('按照鍵降序:',?{key:?value?for?key,?value?in?lst1})
          print('按照值降序:',?{key:?value?for?key,?value?in?lst2})

          #?按照鍵降序:?{'a': 2, 'b': 1, 'c': 3, 'd':?0}
          #?按照值降序:?{'d':?0, 'b': 1, 'a': 2, 'c': 3}

          多個字典排序

          如果一個序列中包含多個字典,現(xiàn)在要根據(jù)條件對這些字典繼續(xù)排序。同樣可以使用sorted()函數(shù)來實現(xiàn)。

          dict_list?=?[
          ????{'letter':?'B',?'number':?'2'},
          ????{'letter':?'A',?'number':?'3'},
          ????{'letter':?'B',?'number':?'1'}
          ]

          #?按?letter?排序
          print(sorted(dict_list,
          ?????????????key=lambda?dic:?dic['letter']))
          #?按?letter,?number?排序
          print(sorted(dict_list,
          ?????????????key=lambda?dic:?(dic['letter'],?dic['number'])))
          ?????????????
          #?[{'letter':?'A',?'number':?'3'},?{'letter':?'B',?'number':?'2'},?{'letter':?'B',?'number':?'1'}]
          #?[{'letter':?'A',?'number':?'3'},?{'letter':?'B',?'number':?'1'},?{'letter':?'B',?'number':?'2'}]

          當然,如果你知道itemgetter()的話,上面的代碼就可以改變一下,執(zhí)行速度會更快。

          from?operator?import?itemgetter

          print(sorted(dict_list,
          ?????????????key=itemgetter('letter')))
          print(sorted(dict_list,
          ?????????????key=itemgetter('letter',?'number')))

          itemgetter()獲取的不是值,而是定義了一個函數(shù),通過該函數(shù)作用到目標對象上。

          堅持 and 努力 :終有所獲。

          推薦閱讀

          1. 別去外包

          2. 再見!MySQL!

          3. 數(shù)據(jù)分析,YYDS



          您看此文用???分??秒,轉(zhuǎn)發(fā)只需1秒

          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  鸡巴网站 在线看 | 无码视频在线免费观看 | 亚洲免费三级 | 在哪能看爱爱网站 | 国产精品国产毛片 |