python3 第十五章 - 数据类型之Sets(集合)

python的官网里对集合的描述是:

Python also includes a data type for sets. A set is an unordered collection with no duplicate elements. Basic uses include membership testing and eliminating duplicate entries. Set objects also support mathematical operations like union, intersection, difference, and symmetric difference.

Python还包括用于集合的数据类型。集合是没有重复元素的无序容器。基本用法包括成员资格测试和消除重复条目。集合对象也支持数学运算,如并,交,差和对称差。

 

特点:

  • 集合是一个无序的,不重复的数据组合
  • 把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系

 

1、创建

用花括号或者set()函数可以用来创建集合。注意,你必须使用set()创建一个空的集合,而不能用{},后面这种写法创建一个空的字典

实例:

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}  # 用花括号的方式创建一个集合

set2 = set('abracadabra')  # 用set()的方式创建一个集合

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

print(basket)

以上代码,输出:

{'banana', 'orange', 'apple', 'pear'}

细心对照一下,你会发现,自动去除了重复,值得一提的是显示的顺序并不表示Sets是有序的

 

2、添加元素

通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}  # 用花括号的方式创建一个集合
print('原来的basket:', basket)

basket.add('apple')  # 添加一个重复的
print('添加一个重复项后:', basket)

basket.add('watermelon')  # 添加一个不重复的
print('添加一个不重复项后:', basket)

以上代码,输出:

原来的basket: {'apple', 'banana', 'pear', 'orange'}
添加一个重复项后: {'apple', 'banana', 'pear', 'orange'}
添加一个不重复项后: {'banana', 'apple', 'watermelon', 'orange', 'pear'}

 

3、删除元素

可通过remove(key)方法可以删除元素:

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}  # 用花括号的方式创建一个集合
print('原来的basket:', basket)

basket.remove('apple')  # 删除 'apple'
print('删除 \'apple\':', basket)

以上代码,输出:

原来的basket: {'apple', 'pear', 'banana', 'orange'}
删除 'apple': {'pear', 'banana', 'orange'}

 

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错

 

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作,我们通过实例来演示:

A = {'apple', 'orange',  'pear',  'banana'}  # 用花括号的方式创建一个集合
B = {'apple', 'orange',  'watermelon'}
C = {'apple', 'orange'}
D = {'c++', 'python'}

print('集合A:', A)
print('集合B:', B)

print('A、B的交集:', A.intersection(B))  # 交集
print('A、B的并集:', A.union(B))  # 并集
print('A、B的差集:', A.difference(B))  # 差集 (项在A中,但不在B中)
print('A、B的对称差集:', A.symmetric_difference(B))  # 对称差集(项在A或B中,但不会同时出现在二者中)

# 子集(判断A是否包含了B里面的所有值)
print('B是A的子集?', B.issubset(A))
print('C是A的子集?', C.issubset(A))

# 父集(判断A是否为B的父集)
print('A是B的父集?', A.issuperset(B))
print('A是C的父集?', A.issuperset(C))

# 无交集(判断两个集合是否完全没有任何交集)
print('A与D是否有交集?', A.isdisjoint(D))
print('A与B是否有交集?', A.isdisjoint(B))

print()  # 输出空行
print()  # 输出空行
print('另一种写法')
print('集合A:', A)
print('集合B:', B)

#  另一种写法
print('A、B的交集 => A & B:', A & B)  # 交集
print('A、B的并集 => A | B:', A | B)  # 并集
print('A、B的差集 => A - B:', A - B)  # 差集(项在A中,但不在B中)
print('A、B的对称差集 => A ^ B:', A ^ B)  # 对称差集(项在A或B中,但不会同时出现在二者中)

以上代码,输出:

集合A: {'apple', 'orange', 'pear', 'banana'}
集合B: {'apple', 'orange', 'watermelon'}
A、B的交集: {'apple', 'orange'}
A、B的并集: {'apple', 'watermelon', 'pear', 'orange', 'banana'}
A、B的差集: {'pear', 'banana'}
A、B的对称差集: {'watermelon', 'pear', 'banana'}
B是A的子集? False
C是A的子集? True
A是B的父集? False
A是C的父集? True
A与D是否有交集? True
A与B是否有交集? False


另一种写法
集合A: {'apple', 'orange', 'pear', 'banana'}
集合B: {'apple', 'orange', 'watermelon'}
A、B的交集 => A & B: {'apple', 'orange'}
A、B的并集 => A | B: {'apple', 'watermelon', 'pear', 'orange', 'banana'}
A、B的差集 => A - B: {'pear', 'banana'}
A、B的对称差集 => A ^ B: {'watermelon', 'pear', 'banana'}
posted @ 2018-01-19 14:13  MrBug  阅读(443)  评论(0编辑  收藏  举报

人生就是一场战斗,唯有披荆斩棘,勇往直前!