集合 (set) 用来存储无序不重复对象。所谓不重复对象,除了不是同一对象外,还包括 "值" 不能相
同。集合只能存储可哈希对象,一样有只读版本 frozenset
同。集合只能存储可哈希对象,一样有只读版本 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>])