7.1 映射类型:字典
映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的关系。
7.1.1 创建字典和赋值
>>> dict1 = []
>>> dict1 = {}
>>> dict2 = {'name': 'earth', 'port': '80'}
>>> dict1, dict2
({}, {'name': 'earth', 'port': '80'})
>>> fdict = dict(['x', 1], ['y', 2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: dict expected at most 1 arguments, got 2
dict expected at most 1 arguments, got 2
>>> fdict = dict((['x', 1], ['y', 2]))
>>> fdict
{'y': 2, 'x': 1}
python 2.2 起可以用工厂函数dict()来创建字典。从Python 2.3 起,可以用内建方法fromkeys() 来创建一个“默认”字典,字典中的元素具有相同的值(若没有给出,则为None):
>>> ddict = {}.fromkeys(('x', 'y'), 1)
>>> ddict
{'y': 1, 'x': 1}
>>> edict = {}.fromkeys(('a', 'b'))
>>> edict
{'a': None, 'b': None}
7.1.2 访问字典的值
>>> for key in dict2:
... print 'key=%s, value=%s' % (key, dict2[key])
key=name, value=earth
key=port, value=80
>>> dict2['name']
'earth'
7.1.3 更新字典
>>> dict2['name'] = 'venus'
>>> dict2['port'] = '88'
>>> dict2['arch'] = 'sunos'
>>> dict2
{'arch': 'sunos', 'name': 'venus', 'port': '88'}
>>> print 'host %(name)s is running on port %(port)s' %dict2
host venus is running on port 88
7.2 映射类型操作符
7.2.1 标准类型操作符
7.2.2 映射类型操作符
1、字典的键查找操作符([])
2、成员关系操作(in, not in)
7.3 映射类型的内建函数和工厂函数
7.3.1 标准类型函数 type() str() cmp()
字典的比较:首先是字典的大小,然后是键,最后是值。
7.3.2 映射类型相关的函数
dict() 不提供参数,生成空字典。若参数是另一个字典,dict()则会从存在的字典里复制内容来生成新的字典。新生成的字典是原来的浅复制版本,但是速度比字典内建方法copy() 慢。
len()
hash() 判断某个对象是否可以作为字典的键。
7.4 映射类型的内建方法
dict.clear() dict clear() dict.fromkeys(seq, val=None) dict.get(key, default=None) dict.has_key(key) dict.items() dict.keys() dict.iter*()---{iteritems(), iterkeys(), itervalues()}
dict.pop(key, [,default]) dict.setdefault(key, default=None) dict.update(dict2) dict.values()
7.5 字典的键
7.5.1 不允许一个键对应多个值
当有键发生冲突,取最后的赋值。
7.5.2 键必须是可哈希的
所有的不可变对象都是可哈希的。值相等的数字表示相同的键,比如 1 和 1.0 的哈希值相同。
7.6 集合类型
集合对象是一组无序排列的可哈希的值。集合成员可以作为字典的键。
7.6.1 如何创建集合类型和给集合类型赋值
>>> s = set('cheeseshop')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t = frozenset('bookshop')
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
>>> len(s)
6
>>> len(s) == len(t)
True
7.6.2 访问集合的值
>>> 'k' in s
False
>>> 'k' in t
True
>>> for i in t:
... print i
b
h
k
o
p
s
7.6.3 更新集合
>>> s.add('x')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's', 'x'])
>>> s.update('update')
>>> s
set(['a', 'c', 'e', 'd', 'h', 'o', 'p', 's', 'u', 't', 'x'])
>>> s.remove('x')
>>> s
set(['a', 'c', 'e', 'd', 'h', 'o', 'p', 's', 'u', 't'])
>>> s -= set('update')
>>> s
set(['c', 'h', 'o', 's'])
7.6.4 删除集合中的成员和集合
>>> del s
>>> s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 's' is not defined
name 's' is not defined
7.7 集合类型操作符
7.7.1 标准类型操作符
1、 in , not in
2、 == , !=
3、<, <= , > , >=
7.7.2 集合类型操作符
1、 联合 (|),有一个等价的方法 union()
>>> s | t
set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
>>> s.union(t)
set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
2、交集(&),有一个等价的方法, intersection()
>>> s & t
set(['h', 's', 'o', 'p'])
>>> s.intersection(t)
set(['h', 's', 'o', 'p'])
>>> s - t
set(['c', 'e'])
>>> s.difference(t)
set(['c', 'e'])
4、对称差分(^)。 这个集合中的元素只能属于s或者只能属于t。
>>> s ^ t
set(['b', 'e', 'k', 'c'])
>>> s.symmetric_difference(t)
set(['b', 'e', 'k', 'c'])
5、混合集合类型操作
s是可变集合,t是一个不可变集合,s在左边,产生的结果仍然是可变集合。但是反过来结果就不一样了。
>>> t | s
frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
>>> t ^ s
frozenset(['c', 'b', 'e', 'k'])
>>> t - s
frozenset(['k', 'b'])
7.7.3 集合类型操作符(仅适用于可变集合)
|= 添加成员,等价于 update()
&= 保留与其他集合的共有成员
-= 保留一个集合中除了另一个集合中的元素之后剩下的元素
^= 返回一个仅包含原来两个集合中其中一个集合的元素
7.8 内建函数
标准类型函数 len()
集合类型工厂函数 set() frozenset()
操作符和内建方法的比较
很多内建方法和操作符时几乎等价的。但是,当使用操作符时,操作符两边的操作数必须是集合。但是使用内建方法时,对象也可以是迭代类型的。