歡迎關注」生信修煉手冊」!
字典是使用最為廣泛的數據結構了,從結構來看,其內容就是鍵值對,鍵稱為key, 值稱為value, 類似詞典中通過前面的索引來快速查找後面的頁面,通過key可以快速定位對應的值。字典,是python中對這種結構的命名,在其他語言中有其他的名字,比如perl中稱之為哈希。
字典通過大括號或者dict函數來創建,用法如下
>>> a = {'one':1, 'tow':2, 'three':3}
>>> a
{'one': 1, 'tow': 2, 'three': 3}
>>> type(a)
<class 'dict'>
key和value之間用冒號分隔,多個鍵值對用逗號分隔。上述字典用dict函數創建的代碼如下
>>> a = dict((('one',1), ('tow',2), ('three',3)))
>>> a
{'one': 1, 'tow': 2, 'three': 3}
>>>
>>> a = dict(zip(['one', 'tow', 'three'], [1, 2, 3]))
>>> a
{'one': 1, 'tow': 2, 'three': 3}
>>>
>>>
>>> a = dict({'one':1, 'tow':2, 'three':3})
>>> a
{'one': 1, 'tow': 2, 'three': 3}
可以看到,dict函數更加靈活,支持多種寫法。字典中的key是無序且唯一的,不存在數字下標索引,要訪問其中的值,只能通過key來訪問,用法如下
>>> a = {'one':1, 'tow':2, 'three':3}
>>> a['one']
1
關於字典,內置了很多方法和函數,常用的幾種如下
1. 訪問字典元素# 方括號加下標
>>> a = {'one':1, 'tow':2, 'three':3}
>>> a['one']
1
# get方法
>>> a.get('one')
1
# 可以重新賦值,也可以新增值
>>> a = {'one':1, 'tow':2, 'three':3}
>>> a['one'] = 2
>>> a
{'one': 2, 'tow': 2, 'three': 3}
# del 刪除元素
>>> del a['one']
# pop刪除元素
>>> a.pop("tow")
# 清空字典
>>> a.clear()
當我們遍歷字典的時候,本質是在遍歷字典的key和value, 通過以下函數可以方便的獲得字典的key或者value
# 返回所有key的列表
>>> a.keys()
dict_keys(['one', 'tow', 'three'])
# 返回所有values的列表
>>> a.values()
dict_values([1, 2, 3])
# 返回(key, value)構成的元組序列
>>> a.items()
dict_items([('one', 1), ('tow', 2), ('three', 3)])
# 返回所有key的列表
>>> list(a)
['one', 'tow', 'three']
# 返回所有key構成的迭代器
>>> iter(a)
<dict_keyiterator object at 0x035A9D20>
>>> for i in iter(a):
... print(i)
...
one
tow
three
在perl中,哈希的key都是字符串,而在python中,字典的key非常靈活,只要是不可變的對象都可以,比如數字,字符串,元組。利用元組,可以模擬多維字典,用法如下
>>> a = {(1, 2):'one', (3, 4):'tow'}
>>> a[(1,2)]
'one'
上面就是字典的基本用法,掌握了基礎,我們來看兩個在實際中經常使用的進階版字典
1. 值為列表的字典python中不僅key很靈活,其value也很靈活。比如我們想要創建一個value為列表的字典,也是可以的
>>> a = {'one' : [1, 2, 3, 4, 5], 'tow':[1, 2, 3, 4, 5]}
>>> a
{'one': [1, 2, 3, 4, 5], 'tow': [1, 2, 3, 4, 5]}
>>> a['one']
[1, 2, 3, 4, 5]
直接寫,當然沒什麼難度,但是在實際工作中,經典的使用場景是循環給字典賦值,如果要實現值為列表,必須先將值設為一個空的列表,用法如下
>>> num = [1, 2, 3, 4, 5]
>>> a = {}
# 直接添加,報錯
>>> for i in num:
... a['one'].append(i)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyError: 'one'
# 先設定為空列表,在追加
# 結果ok
>>> a['one'] = []
>>> for i in num:
... a['one'].append(i)
...
>>>
>>> a
{'one': [1, 2, 3, 4, 5]}
可以看出,關鍵的問題是value的默認值,由於默認值不是列表,所以直接用append方法會報錯。為了解決問題,只需要將默認值設為列表就可以了。python有一個內置模塊collections, 提供了defaultdict函數,可以方便的設置默認值,用法如下
>>> from collections import defaultdict
>>> # 這裡的list表明key的默認value為list
>>> a = defaultdict(list)
>>> for i in num:
... a['one'].append(i)
...
>>>
>>> a
defaultdict(<class 'list'>, {'one': [1, 2, 3, 4, 5]})
用這種寫法更加優雅。
所謂嵌套,就是有多級key, 類似
a[key1][key2] = value
通過設置value的默認值為dict, 可以方便的實現嵌套字典,用法如下
>>> a = defaultdict(dict)
>>> a['one']['tow'] = 1
>>> a['one']['three'] = 2
>>> a
defaultdict(<class 'dict'>, {'one': {'tow': 1, 'three': 2}})
上述寫法只支持兩個key的嵌套 在實際工作中已經可以滿足需求了,兩層以上的嵌套幾乎用不到。
原創不易,歡迎收藏,點讚,轉發!生信知識浩瀚如海,在生信學習的道路上,讓我們一起並肩作戰!本公眾號深耕耘生信領域多年,具有豐富的數據分析經驗,致力於提供真正有價值的數據分析服務,擅長個性化分析,歡迎有需要的老師和同學前來諮詢。轉發本文至朋友圈,後臺私信截圖即可加入生信交流群,和小夥伴一起學習交流。
掃描下方二維碼,關注我們,解鎖更多精彩內容!