Python 中集合和字典的形式相似,可以看作只有键值的字典。
存储方式:
以Hash表进行存储,典型的以空间换时间的策略。
定义方式:
空字典:d = {} 或者 d = set()
带初始值:d = {‘a’, 'b':}
特性:
(1)集合为可变类型,其内部元素可动态修改(增删改)
(2)如果key值重复,后面的数据将覆盖前面的数据。
(3)Python中所有的类型都能进行结合存储,因为Python中一切皆对象,所有对象都有默认的hash算法和比较算法
(4)Python 中非基础类型的对象作为key时,将根据对象的地址进行hash和比较运行。
(5)支持常用内置方法(cmp, len, str)等
(6)集合更像数学容器,支持并集,交集等运算
集合的数学运算:
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}
d1 & d2 # 交集, 同intersection {2, 3}
d1 | d2 # 并集,同union {1, 2, 3, 4, 5}
常用方法:
d1 = {1, 2, 3}
d1.add(4) # 给集合添加一个元素
d1.remove(1) # 删除元素1
d1.pop() # 删除最后一个元素
d1.update({2, 3, 4}) # 用{2,3,4}更新集合,结果为d1 = {2,3, 4}
d1.copy() # 浅拷贝一份d1
自定义Hash
Python 非基础类型的hash和比较算法是基于实例的地址进行计算的,对于自定义类,每个实例对象都将成员其一个元素。
现在我需要通过x值进行比较,如果x值相同则认为两个实例相同,怎么实现?
答:重载类的__hash__算法和__eq__(或者__cmp__)算法即可。