Python 核心编程[第七章]
0x00 字典
字典是 Python 语言中唯一的映射类型。一个字典对象是可变的,它是一个容器类型,与其他序列类容器不同的是存储和访问数据的方式,字典通过键与对应的值进行映射。也就是说字典以键值对的形式表示,而且他是一个可变哈希表实现的无序数据集。字典的键是不允许改变的,并且字典的键必须是可哈希的,所以数字和字符可作为键但列表和其他字典不行。
一、字典的创建等
## 创建
dict1 = {}
dict2 = dict()
dict3 = {}.fromkeys() ## 创建值相同的字典
## 访问
## 遍历
for key in dict1.key():
print(key,dict1[key])
for key in dict1:
print(key,dict1[key])
## 单值访问
dict1[xx]
## 修改
## 更新
## 添加
## 删除
del dict1['xx'] ## 删除键为 xx 的条目
dict1.clear() ## 删除 dict1 中所有条目
del dict1 ## 删除整个 dict1
dict1.pop('xx') ## 删除并返回键为 xx 的条目
二、操作符
1.标准操作符
- 大于、小于、小于等于、大于等于、等于、不等于
2.映射类操作符
(1)字典键查找操作符:
- [ ]
(2)键成员关系操作符:
- ‘key’ in dict
- ‘key’ not in dict
三、内建函数和方法
(1)标准类型函数:
- type()
(2)映射类型相关的函数:
- 工厂:dict()
- 内建:copy() //a = dict(b) 的复制速度比 a = b.copy() 慢
- 内建:len()
- 内建:hash()
(3)映射类型内建方法:
表7.2
- keys():返回关键字列表
- values():返回值列表
- items():返回包含键值元组的列表
- clear():删除字典中的所有元素
- copy():潜复制一个副本
- fromkeys(key,default = None):
- get(key,default = None):
- pop()
- update():添加到
- setdefault()
- iter*:iteritems(),iterkeys(),itervalues()
四、字典的键
字典中的键是有类型限制的。
1.不允许一个键对应多个值
对一个键进行多次复制产生覆盖效果
2.键必须可哈希
像列表和字典这样的可变类型,由于不可以哈希,所以不能作为键,所有的不可变类型都是可哈希的,因此它们都可以作为字典的键。数字类型值相同的两个数表示的键相同(例:1 和 1.0),并且元组类型如果作为键的话该元组的成员不能包括列表这样的可变类型。解释器调用哈希函数,根据字典中的键的值来计算存储你的数据的位置,如果键是可变对象,它的值可改变,如果键发生了改变,哈希函数会映射到不同的地址来存储。如果这样的情况,哈希函数就不可能可靠地存储或获取相关数据。所以才会选择可哈希地键,是因为这些地值不变。
0x01 集合类型
Python 中集合是一组无序排列地可哈希的值,集合成员可以做字典的键。和数学中的集合非常类似。集合有两种不同类型,可变集合(set)和不可变结合(frozenset),可变集合可以添加删除元素,不可变集合不允许这样。
一、集合的创建等
## 创建
s = set() ## 字符串总是被拆分成一个字母 可变集合
s = frozenset() ##不可变集合
## 访问
x in s
x not in s
for i in s :
print i
## 修改
s.add(x) ##添加一个成员
s.update(x) ##将 x 作为一个集合求并
s.remove(x)
## 删除
del s
二、操作符
1.标准类型操作
- 成员关系:in 、not in
- 等价 / 不等价:== / !=
- 子集 / 真子集 / 超集 / 真超集:< / <= / > / >=
- 并集:|
- 交集:&
- 差:-
- 对称差分:^
- 混合集合操作:在某种情况下,可变集合和不可变集合可以混合做标准操作
2.集合类型操作符(仅可变集合)
- (Union) Update ( |=) <=> update()
- &= <=> intersection_update()
- -= <=> difference_update()
- ^= <=> symmetric_difference_update()
三、内建函数和方法
1.标准类型函数
- len()
2.集合类型工厂函数
- set()
- frozenset()
3.方法(所有集合方法)
- s.copy()
- s.issubset(t):判断 s 是否是 t 的子集
- s.isuperset(t):判断 s 是否是 t 的超集
- s.union(t):返回一个新集合
- s.intersection(t)
- s.difference(t)
- s.sy,etric_difference(t)
4.方法(仅适用于可变集合)
- s.update(t):修改 s
- s.intersection_update(t)
- s.difference_update(t)
- s.sy,etric_difference_update(t)
- s.add(obj)
- s.remove(obj)
- s.discard(obj)
- s.pop()
- s.clear()