來自:Python之禪(微訊號:VTtalk)
嗯,乾貨必須收藏
key是否存在
使用 in
關鍵字判斷key是否存在字典中
d = {"name": "zhang", "age":10}
key = "gender"
if key in d:
pass
不要使用 key in d.keys()
, 這是一種畫蛇添足的操作,因為d.keys()會傳回一個新的串列物件,導致記憶體最大。
合併字典
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> {**x, **y}
{'a': 1, 'b': 3, 'c': 4}
傳回新的字典物件,x和y都不會改變,這是使用了PEP448範化解包操作, 如果 x 和 y 有相同的key, 那麼y會改寫x。如果使用字典的update
方法,將修改原來的物件,例如:
>>> y.update(x)
>>> y
{'b': 2, 'c': 4, 'a': 1}
迭代字典
z = {'b': 2, 'c': 4, 'a': 1}
>>> for key, value in z.items():
print(key, value)
b 2
c 4
a 1
也可以直接對字典z進行迭代,每次迭代傳回的是key,前面那種操作 z.items()會傳回一個新的物件。
>>> for key in z:
print(key, z[key])
b 2
c 4
a 1
字典推導
使用字典推導式快速構建字典物件
>>> fruits = ['apple', 'mango', 'banana','cherry']
>>> {f:len(f) for f in fruits}
{'apple': 5, 'mango': 5, 'banana': 6, 'cherry': 6}
字典排序
字典本質上是個無序的容器物件(其實Python3.6開始支援有序,不過這個有序是指按照key的新增順序),如果我們要對字典的 key 或者 value 排序,一般是將其轉換為list,再按照key或者value排序。
>>> d = {"c": 3, "a": 1, "f":6, "b": 0}
# 按照value排序
>>> sorted(d.items(), key=operator.itemgetter(1))
[('b', 0), ('a', 1), ('c', 3), ('f', 6)]
# 按照key排序
>>> sorted(d.items(), key=operator.itemgetter(0))
[('a', 1), ('b', 0), ('c', 3), ('f', 6)]
>>>
預設值初始化字典
統計串列中每個字母出現的次數
>>> chars = ['a', 'b','c','a','d','c']
>>> data = {}
>>> for c in chars:
... if c in data:
... data[c]+=1
... else:
... data[c] = 0
...
>>> data
{'a': 1, 'b': 0, 'c': 1, 'd': 0}
可以使用 collections.defaultdict 透過工廠函式提供初始化預設值
chars = ['a', 'b','c','a','d','c']
dd = defaultdict(int)
for c in chars:
dd[c] += 1
>>>defaultdict(, {'a': 2, 'b': 1, 'c': 2, 'd': 1})
defaultdict 是 dict 的子類,繼承了 dict 的所有特性, 如果想要初始值為1 怎麼辦?可以用lambda函式來指定
dd = defaultdict(lambda: 1)
for c in chars:
dd[c] += 1
print(dd)
>>> defaultdict(lambda
> at 0x01226B28>, {‘a’: 3, ‘b’: 2, ‘c’: 3, ‘d’: 2})
朋友會在“發現-看一看”看到你“在看”的內容