Python 字典创建、更新、按键值排序、取最大键值对等操作
1. 字典創(chuàng)建
In [1]: d = {}In [2]: d
Out[2]: {}In [3]: d = dict()In [4]: d
Out[4]: {}In [5]: dict(a=1,b=2)
Out[5]: {'a': 1, 'b': 2}In [7]: dict([('a', 1), ('b', 2)])
Out[7]: {'a': 1, 'b': 2}In [8]: dict(zip(['a', 'b'], [1, 2]))
Out[8]: {'a': 1, 'b': 2}
注意:在 Python3 中 zip 返回的是一個(gè)對(duì)象,需要用 list 轉(zhuǎn)換為列表
In [15]: z = zip(['a', 'b'], [1, 2])In [16]: z
Out[16]: <zip at 0x6c7b1c8>In [17]: list(z)
Out[17]: [('a', 1), ('b', 2)]
2. 字典更新(update)
In [1]: d = {'a':1, 'b':2}# 方法 1
In [2]: d.update({'c': 3})In [3]: d
Out[3]: {'a': 1, 'b': 2, 'c': 3}# 方法 2
In [4]: d.update([('d', 4)])In [5]: d
Out[5]: {'a': 1, 'b': 2, 'c': 3, 'd': 4}# 方法 3
In [6]: d.update([('e', 5)], f=6)In [7]: d
Out[7]: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
3. 字典更新(setdefault)
如果僅當(dāng)字典中不存在某個(gè)鍵值對(duì)時(shí),才插入到字典中;如果存在,不必插入(也就不會(huì)修改鍵值對(duì))。這種場景,使用字典自帶方法 setdefault :
In [8]: d = {'a':1, 'b':2}# 更新成功返回更新的 value
In [9]: d.setdefault('c', 3)
Out[9]: 3In [10]: d
Out[10]: {'a': 1, 'b': 2, 'c': 3}# 更新不成功返回默認(rèn)的 value
In [11]: d.setdefault('a', 4)
Out[11]: 1In [12]: d
Out[12]: {'a': 1, 'b': 2, 'c': 3}
4. 字典并集
In [16]: def merge(d1, d2):...: return {**d1, **d2}...: In [17]: a = {'a':1, 'b':2}In [18]: b = {'c':3}In [19]: merge(a, b)
Out[19]: {'a': 1, 'b': 2, 'c': 3}In [20]: b = {'b':3}In [21]: merge(a, b)
Out[21]: {'a': 1, 'b': 3}In [48]: m = merge(a, b)
In [49]: m['a'] = 10
Out[49]: a
In [50]:{'a':1, 'b':2}
當(dāng) a 和 b 中有相同的 key 時(shí),會(huì)用最后出現(xiàn)的 key-value 代替之前的 key-value
當(dāng)修改 merge 之后的元素后, a 中的元素并不變。要想改變可以使用 collections 模塊中的 ChainMap
In [50]: from collections import ChainMap
In [52]: d1 = {'x': 1, 'y': 2 }In [53]: d2 = {'y': 3, 'z': 4 }In [54]: merged = ChainMap(d1, d2)In [55]: merged
Out[55]: ChainMap({'x': 1, 'y': 2}, {'y': 3, 'z': 4})In [56]: merged['y'] = 10In [57]: merged
Out[57]: ChainMap({'x': 1, 'y': 10}, {'y': 3, 'z': 4})In [59]: d1
Out[59]: {'x': 1, 'y': 10}In [60]: d2
Out[60]: {'y': 3, 'z': 4}
5. 字典差集
In [22]: def diff(a, b):...: return dict([(k, v) for k, v in a.items() if k not in b])...: In [23]: a = {'a':1, 'b':2}In [24]: b = {'b':3}In [25]: diff(a, b)
Out[25]: {'a': 1}
6. 按鍵排序
In [26]: d = {"d":4, "c":3, "b":2, "a": 1}In [27]: d
Out[27]: {'d': 4, 'c': 3, 'b': 2, 'a': 1}In [28]: sorted(d.items(), key=lambda x: x[0])
Out[28]: [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
d.items() 返回元素為 (key, value) 的可迭代類型(Iterable), key 函數(shù)的參數(shù) x 便是元素 (key, value) ,所以 x[0] 取到字典的 key 值。
7. 按值排序
In [34]: d = {"d":1, "a":4, "b":3, "c": 2}In [35]: sorted(d.items(), key=lambda x: x[1])
Out[35]: [('d', 1), ('c', 2), ('b', 3), ('a', 4)]
8. 最大鍵值對(duì)
In [36]: def max_dict(d):...: if len(d) == 0:...: return []...: max_value = max(d.values())...: return [(key, max_value) for key in d if d[key]==max_value]...: In [39]: d = {'a':1, 'b':2, 'c':2}In [40]: max_dict(d)
Out[40]: [('b', 2), ('c', 2)]
9. 一鍵對(duì)應(yīng)多值
常規(guī)做法是判斷 key 是否在字典中,不在的話給其賦值為列表。
In [61]: d = {}In [62]: a = ['a', 'b', 'c']In [63]: for k in a:...: if k not in d:...: d[k] = []...: In [64]: d
Out[64]: {'a': [], 'b': [], 'c': []}
比較優(yōu)雅的寫法使用 collections 模塊的 defaultdict :
In [65]: from collections import defaultdictIn [68]: key_lst = [('a', 'aaa'), ('b', 'bbb'), ('c', 'ccc')]In [71]: d = defaultdict(list)In [72]: d
Out[72]: defaultdict(list, {})In [73]: for k, v in key_lst:...: d[k].append(v)...: In [74]: d
Out[74]: defaultdict(list, {'a': ['aaa'], 'b': ['bbb'], 'c': ['ccc']})In [75]: d.keys()
Out[75]: dict_keys(['a', 'b', 'c'])In [76]: d.values()
Out[76]: dict_values([['aaa'], ['bbb'], ['ccc']])
10. 找出字典前 N 個(gè)最大值
找出字典前 n 個(gè)最大值,對(duì)應(yīng)的鍵。導(dǎo)入 Python 內(nèi)置模塊 heapq 中的 nlargest 函數(shù),獲取字典中的前 n 個(gè)最大值。 key 函數(shù)定義按值比較大小:
In [77]: d = {'a': 10, 'b': 8, 'c': 9, 'd': 10}In [78]: from heapq import nlargestIn [79]: nlargest(2, d, key=lambda k: d[k])
Out[79]: ['a', 'd']
總結(jié)
以上是生活随笔為你收集整理的Python 字典创建、更新、按键值排序、取最大键值对等操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车档位开关是那五个?
- 下一篇: Python 高阶函数filter、ma