映射和集合类型

字典的 增删改查

aDict = {1:'a', 2:'b'}
del aDict[1] ----key,value,索引
aDict[3] = 'c'
del aDict
print aDict[3] --NameError

类型操作符

1.标准
< <= > >= == !=

2.映射
键查找操作符:[]
键成员关系操作符: in not in

内建函数、工厂函数

1.标准类型
type() 、str()、cmp()

2.映射类型相关
dict()、len()、hash()

3.映射内建方法
dict.keys()/dict.values() 返回字典中键/(或)值的列表
dict.clear()
dict.fromkeys(seq,val = None) 创建一个新字典,key 对应seq值,value 都默认为None(未指定Val的话)
dict.get(key,default=None)
dict.has_key(key) 判断key 是否存在,基本被in not in 取代
dict.items() 返回一个字典 键-值 对形式的列表
dict.iteritems() 返回一个迭代子,也就是items的一个元素
dict.pop()
dict1.update(dict2) 把字典2添加到字典1中

字典的键

1.不允许一个键对应多个值

>>> aDict = {1:2,1:3,2:5}
>>> aDict
{1: 3, 2: 5}

Python从左到右检查键值对,1:2 会被覆盖

2.键必须是可hash
数字1.0 == 1所以是一个key值,只能存在一个,但为什么1:3->1.0:3?

>>> 1.0 == 1
True
>>> a = {1.0:2,1:3,2:5}
>>> a
{1.0: 3, 2: 5}

为什么要求可hash?
dict存储的时候会对键做hash处理,然后根据hash后的值来计算存储位置。如果键是可变的,hash就会得到不同的值。
但,如果键是可变的,却实现了hash()方法,返回一个整数,也可以作为字典的键

集合类型

可变集合:set
不可变集合:frozenset

>>> b = set(12345567)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> a = set('adcadcyuio')
>>> a
set(['a', 'c', 'd', 'i', 'o', 'u', 'y'])

set(集合) 只可通过工厂函数 set() /frozenset() 创建
访问:遍历查看,或者通过检查某项是否存在 in 。
更新:a.add('z')
删除:del a

<b>集合类型操作符</b>
1.标准
成员关系:in not in ,
集合等价/不等价: == !=
子集/超集:< <= > >=

2.集合类型操作符 (所有)

  • 联合 |
  • 交集 &
  • 差补 -
  • 对称差分/异或 ^ (XOR)

3.集合类型操作符(可变)

  • Update |=
>>> s = set('cheeseshop')
>>> u = frozenset(s)
>>> s |= set('pypi')
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])
  • Retention/Intersection Update &=
>>> s = set(u)
>>> s &= set('shop')
>>> s
set(['h', 's', 'o', 'p'])
  • Difference Update -=
>>> s = set(u)
>>> s -= set('shop')
>>> s
set(['c', 'e'])
  • Symmetric Difference Update ^=
>>> s = set(u)
>>> t = frozenset('bookshop')
>>> s ^= t
>>> s
set(['c', 'b', 'e', 'k'])

集合类型内建方法

  • len()、set()、frozenset()
  • 以及操作符对应的方法
  • s.add()/s.remove()/s.pop()/s.clear()
  • s.discard(obj) 丢弃操作,remove()的友好版本,如果s存在Obj,从s中删除

推荐阅读更多精彩内容