記錄學習《流暢的python》的一些知識-----字典和集合(1)
阿新 • • 發佈:2020-12-30
記錄我學習《流暢的python》的過程
2020.12.28
1.泛對映型別
標準庫裡的所有對映型別都是利用dict來實現的,因此它們有個共同的限制,即只有可雜湊的資料型別才能用作這些對映裡的鍵。
如果一個物件是可雜湊的,那麼在這個物件的生命週期中,它的雜湊值是不變的,而且這個物件需要實現__hash__()方法。
原子不可變資料型別(str、bytes和數值型別)都是可雜湊型別,frozenset是可雜湊的,因為根據其定義,frozenset裡只能容納可雜湊型別。元組的話,只有當一個元組包含的所有元素都是可雜湊型別的情況下,它才是可雜湊的。
tt = (1, 2, (30, 40))
print(hash(tt))
tl = (1, 2, [30, 40])
print(hash(tl))
tf = (1, 2, frozenset([30, 40]))
print(hash(tf))
執行結果:
2.字典推導
列表推導和生成器表示式的概念可以移植到字典上,從而有了字典推導,它可以從任何以鍵值對作為元素的可迭代物件中構建出字典。
例:利用字典推導可以把一個裝滿元組的列表變成兩個不同的字典。
DIAL_CODES = [
(86, 'China'),
(91, 'India'),
(1, 'United States' ),
(62, 'Indonesia'),
(55, 'Brazil'),
(92, 'Pakistan'),
(880, 'Bangladesh'),
(234, 'Nigeria'),
(7, 'Russia'),
(81 , 'Japan'),
]
country_code = {country: code for code, country in DIAL_CODES}
print(country_code)
print({code: country.upper() for country, code in country_code. items() if code < 66})
執行結果:
3.用setdefault處理找不到的鍵
dict.get並不是處理找不到的鍵的最好方法。
沒有優化的程式舉例:
"""建立一個從單詞到其出現情況的對映"""
import sys
import re
WORD_RE = re.compile(r'\w+')
index = {}
with open(sys.argv[1], encoding='utf-8') as fp:
for line_no, line in enumerate(fp, 1):
for match in WORD_RE.finditer(line):
word = match.group()
column_no = match.start()+1
location = (line_no, column_no)
index.setdefault(word, []).append(location)
# 以字母順序打印出結果
for word in sorted(index, key=str.upper):
print(word, index[word])
執行結果(需要更正):