散串列是字典型別性能出眾的根本原因
可散列的資料型別:如果一個物件是可散列的,那么在這個物件的生命周期中,它的散列值是不變的,而且這個物件需要實作__hash__() 方法
需要有__eq__()方法才可以與其他鍵做比較,如果兩個可散列物件是相等的,那么它們的散列值一定是一樣的,
散列值:物件的id()函式的回傳值
可散列
一個可散列的物件必須滿足以下要求,
(1) 支持 hash() 函式,并且通過 hash__() 方法所得到的散列值是不變的,(2) 支持通過 __eq() 方法來檢測相等性,
(3) 若 a == b 為真,則 hash(a) == hash(b) 也為真,
字典的構造方法
a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('one', 1), ('two', 2), ('three', 3)])
e = dict({"one": 1, "two": 2, "three": 3})
f = {i: j for i, j in [("one", 1), ("two", 2), ("three", 3)]} # 字典推導式
統計一串字符各個字母出現的索引值
test_str = 'ashjdlkqashfljkaskldfjalshflaksdnvklzkxcbfihqwdjuabs'
使用常規方法
for index, s in enumerate(test_str):
if s not in my_dict:
my_dict[s] = []
my_dict[s].append(index)
使用setdefault
my_dict = {}
for index, s in enumerate(test_str):
my_dict.setdefault(s, []).append(index)
彈性鍵查詢
使用defaultdict
上面的問題使用defaultdict可以很方便的解決
import collections
my_dict = collections.defaultdict(list)
for index, i in enumerate(test_str):
my_dict[i].append(index)
defaultdict在使用get方法的時候不會自動創建默認的型別
print(my_dict['a1']) # []
print(my_dict.get('a2')) # None
字典的變種
OrdereDict
有順序的字典:
collections.OrdereDict
import collections
a = collections.OrderedDict()
a['a'] = 1
a['c'] = 3
a['b'] = 2
print(a) # OrderedDict([('a', 1), ('c', 3), ('b', 2)])
a.popitem()
print(a) # OrderedDict([('a', 1), ('c', 3)])
ChainMap
容納不同的映射物件
collections.ChainMap
一個
ChainMap類是為了將多個映射快速的鏈接到一起,這樣它們就可以作為一個單元處理,它通常比創建一個新字典和多次呼叫update()要快很多,這個類可以用于模擬嵌套作用域,并且在模版化的時候比較有用,
將多個字典或者其他映射組合在一起,創建一個單獨的可更新的視圖
b = collections.ChainMap(locals())
創建一個物件,它內部包含了當前的區域變數
直接使用b['a']方法去查找內容
!b['a']
Counter
計數:
collections.Counter
c = collections.Counter("asfsdfasdfasdfasdf")
print(c)# Counter({'s': 5, 'f': 5, 'a': 4, 'd': 4})
UserDict
純python實作的dict
注意點:速度是以犧牲空間為代價而換來的
字典在記憶體上的開銷巨大,
如果需要存盤數量巨大的內容,推薦使用元祖或者具名元祖,
字典的實作是典型的空間換時間
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/232582.html
標籤:python
