Python字典:竟還有我不會的高階玩法?
↑?關注 + 星標?,每天學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)對key或value的排序。
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 努力 :終有所獲。
推薦閱讀
您看此文用? ?
?分?
?
秒,轉(zhuǎn)發(fā)只需1秒

?
?分?
?
秒,轉(zhuǎn)發(fā)只需1秒