Python set

集合 (set) ⽤用来存储⽆无序不重复对象。所谓不重复对象,除了不是同⼀一对象外,还包括 "值" 不能相
同。集合只能存储可哈希对象,⼀一样有只读版本 frozenset。
判重公式:(a is b) or (hash(a) == hash(b) and eq(a, b))
在内部实现上,集合和字典⾮非常相似,除了 Entry 没有 value 字段。集合不是序列类型,不能像
列表那样按序号访问,也不能做切⽚片操作。
>>> 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'])
41
>>> s.update(set("abcd"))?? ? ? # 合并集合
>>> s
set(['a', 'c', 'b', 'd'])
>>> s.pop()? ? ? ? ? ? # 弹出元素
'a'
>>> s
set(['c', 'b', 'd'])
集合和字典、列表最⼤大的不同除了元素不重复外,还⽀支持集合运算。
>>> "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)
42
>>> 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'])? ? ? ? ?
集合和字典主键都必须是可哈希类型对象,但常⽤用的 list、dict、set、defaultdict、OrderedDict
都是不可哈希的,仅有 tuple、frozenset 可⽤用。
>>> 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
43
...
... 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>])
???
数据结构很重要,这⼏几个内置类型并不⾜足以完成全部⼯工作。像 C、数据结构、常⽤用算法这类基础是
每个程序开发⼈人员都应该掌握的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值