python 数据结构 set 用法

集合(set)是一个无序的不重复元素序列。

A set object is an unordered collection of distinct hashable objects.
set 是一个无序的,不重复的可hash 对象.

用来 存储 不重复元素的一个容器,并且元素直接是无序的.

可以使用大括号 { } 或者 set() 函数创建集合.
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

# 创建一个set 
s = set([3,5,9,10])    
s
{9, 10, 3, 5}
t = set("Hello")         #创建一个唯一字符的集合
t
{'H', 'o', 'e', 'l'}


# 也可以这样创建一个集合
# s = {3,5,9,10}


#创建一个空集合 
s = set()


# 添加元素
#如果 已经存在的元素,不会重新添加

s = {3,5,9,10}
s.add(5)
s
{9, 10, 3, 5}
s.add(66)
s
{66, 3, 5, 9, 10}



#判断一个元素是否在  集合可以用 in 
5 in s 
True
6 in s
False
66 in s 
True



# 求集合长度  
len(s)
5


# 删除元素集合中的一个元素
>>> s.remove(66)
>>> s
{3, 5, 9, 10}



# remove 删除一个不存在的元素 会报错 KeyError
s.remove('frank')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 'frank'



# 也可以用来删除 元素, 如果不存在不会报错, 不会对集合做任何操作直接返回None.
#  Remove an element from a set if it is a member.
#  If the element is not a member, do nothing.

>>> s
{3, 5, 9, 10}
>>> s.discard('frank')
>>> s
{3, 5, 9, 10}


# 集合的拷贝 s.copy 这是一个浅拷贝
>>> s = set()
>>> s.add(1)
>>> s.add(10)
>>> s.add(5)
>>> s
{1, 10, 5}
>>> s.add(7)
>>> s
{1, 10, 5, 7}
>>> s.copy()
{1, 10, 5, 7}
>>> s2 = s.copy()
>>> s2
{1, 10, 5, 7}




#集合运算里面 有交 并 补  差集  运算 

>>> s={1,2,3,4}
>>> s2 = {3,4,5,6,7}
>>> s,s2
({1, 2, 3, 4}, {3, 4, 5, 6, 7})
>>> s
{1, 2, 3, 4}
>>> s2
{3, 4, 5, 6, 7}
>>> s& s2
{3, 4}
>>> s.intersection(s2)  # 交集
{3, 4}
>>> s
{1, 2, 3, 4}
>>> s 
{1, 2, 3, 4}
>>> s2
{3, 4, 5, 6, 7}
>>> s.difference(s2)  # 差集
{1, 2}
>>> s - s2  
{1, 2}

# 集合的并集

>>> s.union(s2)
{1, 2, 3, 4, 5, 6, 7}
>>> s|s2
{1, 2, 3, 4, 5, 6, 7}


集合的交集 和差集 运算

交集 s & s2 或 s.intersection(s2) 交集运算

差集 s - s2 或 s.difference(s2) 差集运算

并集 s |s2 或 s.union(s2) 并集运算

>>> s  
{1, 2, 3, 4}
>>> s2 
{3, 4, 5, 6, 7}
>>> s.symmetric_difference(s2)
{1, 2, 5, 6, 7}
>>> s^s2  
{1, 2, 5, 6, 7}


删除 两个集合相同的元素,其他的元素构成一个集合返回. 比如上面的例子, 3,4 是公共元素,去掉两个集合的公共元素,其他的元素构成一个新的集合返回. {1,2,5,6,7}

s^s2 或 s.symmetric_difference(s2)

判断集合之间的关系

s.issubset(other) 判断 自己是不是 other 的子集.即判断 s <= other 返回 True or False

s.issuperset(other) 判断 s >= other 返回 True or False

issubset(other)
set <= other
Test whether every element in the set is in other.
# 这个方法是判断  自己是不是 另一个集合的子集 


issuperset(other)
Report whether this set contains another set.
# 这个方法 判断 自己 是否包含另一个集合. 


>>> s
{1, 2, 3, 4}
>>> s2
{1, 2, 3, 4, 5, 6}
>>> 
>>> s.issubset(s2)
True


>>> s2.issuperset(s)
True

set里面 还有很多 xxxxx_update 方法
这里 的作用 把更新的结果 直接写回到原集合里面.就相当于原地修改集合

s.difference_update(other)   # 求差集把结果更新到 s 集合里面
s.intersection_update(other) # 求交集把结果更新到 s 集合里面
s.symmetric_difference_update(other)  # 求 这个运算的结果  把结果写到s里面. 

下面 举个例子:

# 差集更新  
s = {1, 2, 3, 4}
s2 = {3, 4, 5, 6, 7}
s - s2
{1, 2}
s.difference(s2)
{1, 2}
s
{1, 2, 3, 4}
s2
{3, 4, 5, 6, 7}
s.difference_update(s2)


# 交集更新 
s = {1, 2, 3, 4}
s2 = {3, 4, 5, 6, 7}
s.intersection(s2)
{3, 4}
s.intersection_update(s2)
s
{3, 4}


# symmetric_difference_update  我也不知道叫什么运算,暂且叫异或运算吧, 把结果更新到 s 里面.

s
{1, 2, 3, 4}
s2
{3, 4, 5, 6, 7}

s.symmetric_difference(s2)
{1, 2, 5, 6, 7}

s.symmetric_difference_update(s2)
s
{1, 2, 5, 6, 7}
#  s.update(other)
# update 方法, 将一个其他的集合 更新到自己的集合里面. 相当于批量add 操作 
# 如果有相同的元素, 也只会有一个更新的到集合里面. 不会报错. (集合本身是不重复的特性)
>>> s
{1, 2, 7}
>>> s2 = {11,22,33}
>>> s.update(s2)
>>> s
{1, 2, 33, 22, 7, 11}
>>> s2
{33, 11, 22}

方法 pop()
s.pop () 随机 删除 集合中的元素 ,并且返回该元素 , 如果集合是空的,会抛异常KeyError

>>> s = {1,34,56,32,11,35,67,89,56}
>>> s
{32, 1, 34, 35, 67, 11, 56, 89}
>>> s.pop()
32
>>> s.pop()
1
>>> s.pop()
34
>>> s.pop()
35
>>> s.pop()
67
>>> s.pop()
11
>>> s.pop()
56
# 清空集合
# s.clear()   清空集合,使其变成一个空集合.
s = {1,34,56,32,11,35,67,89,56}
s.clear()
s
set()

总结

集合一般可以用来去重操作, 当需要存放不同的元素的时候,可以考虑用set来保存元素.

参考文档

set集合 https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset

<center> 分享快乐,留住感动. 2019-02-02 17:43:06 --frank </center>