第3章 字典和集合

dicti类型在各种程序中得到广泛应用,模块的命名空间、实例的属性和函数的关键字参数中都可以看到字段的身影。跟它有关的内置函数都在__builtins__.__dict__模块中。
Python对dict的实现做了高度优化,而散列表是字典类型性能出众的根本原因。集合(set)的实现其实也依赖于散列表。想要进一步理解集合和字典,就得先理解散列表的原理。

3.1 泛映射类型
collections.abc模块中有Mapping和MutableMapping这两个抽象基类,它们的作用为了dict和其他类似的类型定义形式接口。这些基类主要是作为形式化的文档,定义了构建一个映射类型所需要的最基本的接口。

3.2 字典推导
#字典推导应用
>>> DIAL_CODES = [
    (91, 'India'),
    (1, 'United States'),
    (62, 'Indonesia'),
    (7, 'Russia'),
    (81, 'Japan'),
    ]
>>> country_code = {country: code for code, country in DIAL_CODES}
>>> country_code
{'India': 91, 'United States': 1, 'Indonesia': 62, 'Russia': 7, 'Japan': 81}
>>> {code: country.upper() for country, code in country_code.items() if code < 66}
{1: 'UNITED STATES', 62: 'INDONESIA', 7: 'RUSSIA'}

3.3 常见的映射方法
常见的映射方法,这里就不一一列出。

用setdefault处理找不到的键


3.4 映射的弹性键查询
如果某个键在映射里不存在,可以通过以下两种方式通过这个键读取得到一个默认值。
  • 一个是通过defaultdict这个类型而不是普通的dict。
  • 另一个是给自己定义一个dict的子类,并在子类实现__missing__方法。
3.5 字段的变种
省略

3.6 子类化UserDict
省略

3.7 不可变映射类型
省略

3.8 集合论
集合的本质是许多唯一对象的聚集。因此,可以去重。它的特点就是以空间换时间,耗内存,易查询,使用频率低。这些特点归功于它背后的散列表。
>>> l = ['spam','spam','eggs','spam']
>>> l
['spam', 'spam', 'eggs', 'spam']
>>> set(l)
{'spam', 'eggs'}
>>> list(set(l))
['spam', 'eggs']

注意:如果要创建一个空集,需使用不带参数的set()方法。如果只是写成{}的形式,那创建的是个空字典。

集合推导
>>> from unicodedata import name
>>> {chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}
{'®', '§', '°', '©', '±', '¢', '%', '+', '¬', '¶', '>', '¤', 'µ', '×', '£', '¥', '<', '#', '÷', '$', '='}

集合的操作:
(1)数学运算
Python
方法
描述
s & z
s.__and__(z)
s和z的交集
s | z
s.__or__(z)
s和z的并集
s - z
s.__sub__(z)
s和z的差集
s ^ z
s.__xor__(z)
s和z的对称差集

(2)比较运算
Python运算符
方法
描述
e in s
s.__contains__(e)
元素e是否属于s
s <= z
s.__le__(z)
s是否为z的子集
s < z 
s.__lt__(z)
s是否为z的真子集
s >= z
s.__ge__(z)
s是否为z的父集
s > z
s.__gt__(z)
s是否为z的真父集

(3)其他方法

方法
set
frozenset
描述
s.add(e)
*

把元素e添加到s中
s.clear()
*

移除掉s中的所有元素
s.copy()
*
*
对s浅复制
s.discard(e)
*

如果s里有e这个元素的话,把它移除
s.__iter__()
*
*
返回s的迭代器
s.__len__()
*
*
len(s)
s.pop()
*

从s中移除一个元素并返回它的值,若s为空,则抛出KeyError异常
s.remove(e)
*

从s中移除e元素,若e元素不存在,则抛出KeyError异常

3.9 dict和set的背后
Python用散列表实现dict和set的,具体如何实现这里就不一一展开。
特点:
  • 键必须是可散列的
  • 内存开销大
  • 键查询很快
  • 键的次序取决于添加顺序
  • 新增会改变原有的顺序

3.10 本章小结
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值