python 专题十五 集合

集合 (set) 用来存储无序不重复对象。所谓不重复对象,除了不是同一对象外,还包括 "值" 不能相
同。集合只能存储可哈希对象,一样有只读版本 frozenset
>>> s = set("abc")     # 通过序列类型初始化。
>>> s
set(['a', 'c', 'b'])
>>> {v for v in "abc"}    # 通过构造表达式创建。
set(['a', 'c', 'b'])
>>> "b" in s     # 判断元素是否在集合中。
True
>>> s.add("d")     # 添加元素
>>> s
set(['a', 'c', 'b', 'd'])
>>> s.remove("b")     # 移除元素
>>> s
set(['a', 'c', 'd'])
>>> s.discard("a")     # 如果存在,就移除。
>>> s
set(['c', 'd'])
>>> s.update(set("abcd"))   # 合并集合
>>> s
set(['a', 'c', 'b', 'd'])
>>> s.pop()      # 弹出元素
'a'
>>> s
set(['c', 'b', 'd']);w
>>> "c" in set("abcd")    # 判断集合中是否有特定元素。
True
>>> set("abc") is set("abc")
False
>>> set("abc") == set("abc")   # 相等判断
True
>>> set("abc") = set("abc")   # 不等判断
False
>>> set("abcd") >= set("ab")   # 超集判断 (issuperset)
True
>>> set("bc") < set("abcd")   # ⼦子集判断 (issubset)
True
>>> set("abcd") | set("cdef")   # 并集 (union)
set(['a', 'c', 'b', 'e', 'd', 'f'])
>>> set("abcd") & set("abx")   # 交集 (intersection)
set(['a', 'b'])
>>> set("abcd") - set("ab")   # 差集 (difference), 仅左边有,右边没有的。
set(['c', 'd'])    
>>> set("abx") ^ set("aby")   # 对称差集 (symmetric_difference)
set(['y', 'x'])     # 不会同时出现在两个集合当中的元素。
>>> set("abcd").isdisjoint("ab")  # 判断是否没有交集
False

 

更新操作

>>> s = set("abcd")
>>> s |= set("cdef")    # 并集 (update)
>>> s
set(['a', 'c', 'b', 'e', 'd', 'f'])
>>> s = set("abcd")
>>> s &= set("cdef")    # 交集 (intersection_update)
>>> s
set(['c', 'd'])
>>> s = set("abx")
>>> s -= set("abcdy")    # 差集 (difference_update)
>>> s
set(['x'])   
>>> s = set("abx")
>>> s ^= set("aby")    # 对称差集 (symmetric_difference_update)
>>> s
set(['y', 'x'])
>>> hash([])
TypeError: unhashable type: 'list'
>>> hash({})
TypeError: unhashable type: 'dict'
>>> hash(set())
TypeError: unhashable type: 'set'
>>> hash(tuple()), hash(frozenset())
(3527539, 133156838395276)
如果想把自定义类型放入集合,需要保证 hash 和 equal 的结果都相同才能去
>>> class User(object):
... def __init__(self, name):
... self.name = name
>>> hash(User("tom")) # 每次的哈希结果都不同
279218517
>>> hash(User("tom"))
279218521
>>> class User(object):
... def __init__(self, name):
... self.name = name
...
... def __hash__(self):
... return hash(self.name)
...
... def __eq__(self, o):
... if not o or not isinstance(o, User): return False
... return self.name == o.name
>>> s = set()
>>> s.add(User("tom"))
>>> s.add(User("tom"))
>>> s
set([<__main__.User object at 0x10a48d150>])



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值