1. 程式人生 > 其它 >記錄學習《流暢的python》的一些知識-----字典和集合(1)

記錄學習《流暢的python》的一些知識-----字典和集合(1)

技術標籤:python字典

記錄我學習《流暢的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])

執行結果(需要更正):
在這裡插入圖片描述