记录学习《流畅的python》的一些知识-----字典和集合(1)

记录我学习《流畅的python》的过程

    • 2020.12.28

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))

运行结果:
在这里插入图片描述
记录学习《流畅的python》的一些知识-----字典和集合(1)_第1张图片
在这里插入图片描述
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])

运行结果(需要更正):
记录学习《流畅的python》的一些知识-----字典和集合(1)_第2张图片

你可能感兴趣的:(python,字典)