Python 元组和字典
定义
元组定义: t = {} 或者 t = set()
字典定义:d = {} 或者 d = dict()
定义形式相同但是存储元素不同,如:元组 t = {1, 2, 3},字典 d = {1: 1, 2: 2, 3: 3}
描述
元组和字典为无序容器。
元组和字典为python的内置类型。
元组和字典存储方式为hash表存储。
元组为无键值的字典。
元组和字典的key值不能重复。
由于是基于hash表存储,存取速度取决于hash算法。
Python 中所有的类型(内置类型,自定义类型)都有默认的hash和比较算法,故所有类型都能存储到元组或字典。
Python 非基础类型(容器、类等)默认hash函数和比较算法函数都是基于类型实例的地址进行计算的。
元组和字典不能存在相同元素,如果存在,则后面的元素将覆盖前面的元素。
如 t = {1, 2, 2, 3} 和 t = {1, 2, 3}等效, d = {1:1, 2: 2, 2: 20, 3:3} 和 d = {1:1, 2:20, 3:3}等效
自定义Hash
Python 非基础类型的hash和比较算法是基于实例的地址进行计算的,对于自定义类,每个实例对象都将成员其一个元素。
现在我需要通过x值进行比较,如果x值相同则认为两个实例相同,怎么实现?
答:重载类的__hash__算法和__eq__(或者__cmp__)算法即可。
使用方法
字典:键值对的使用
部分函数描述(其他都是通常用法,不做描述)
fromkeys(S, v=None):将一个列表S(链表或元组)的元素转换为字典的key值,默认值为v。
如:l = [1, 2]; d = dict.fromkeys(l) ==> {1: None, 2: None, 3: None}
get(k, d=None):读取字典中key值为k的值,如果k不存在,则返回d默认值。
如:d = {1:1, 2:2},get(3) ==> None, 通过d[3]取值,将会抛出异常
集合:集合的操作(交集、并集、差集等)
d1 = {1, 2, 3}
d2 = {2, 3, 4, 5}
d1.union(d2) # 并集 {1, 2, 3, 4, 5}
d1.intersection(d2) # 交集 {2, 3}
d1.symmetric_difference(d2) # 差集{1, 4, 5}
d1.difference(d2) # 差集(d1存在,d2不存在){1}
d2.difference(d1) # 差集(d2存在,d1不存在){4, 5}
其他
(1)链表去重:l = [1, 2, 2, 3],
无序去重: l = list(set(l))
有序去重: l = sorted(list(set(l)), key=l.index)
(2)有序字典:collections.OrderedDict()