- images
- results
- .gitignore
- 1.1概论.ipynb
- 1.2 环境配置.pdf
- 1.3数据类型.ipynb
- 1.4 人机交互.ipynb
- 1.5 对象与变量.ipynb
- 1.6 编码与命名规范.ipynb
- 2.1 数值类型.ipynb
- 2.2 数值类型转换.ipynb
- 2.3 数值元算.ipynb
- 2.4常用数学运算函数.ipynb
- 2.5 math 模块及其应用.ipynb
- 2.6.1 逻辑值测试.ipynb
- 2.6.2 成员运算.ipynb
- 2.6.3 比较运算.ipynb
- 2.6.4 布尔运算.ipynb
- 2.6.5 运算优先级.ipynb
- 2.ipynb
- 3.1 流程控制结构.ipynb
- 3.3.1 for 循环语句.ipynb
- 3.3.3 rang.ipynb
- 3.3.3 while 循环语句.ipynb
- 3.4 and 3.5 分支结构和条件.ipynb
- 3.6 and 3.7 .ipynb
- 3.9 异常处理.ipynb
- 4 函数和模块化编程.ipynb
- 4.1 函数的定义、调用与返回值.ipynb
- 4.2 函数的参数传递.ipynb
- 4.3 变量的作用域.ipynb
- 4.4 匿名函数.ipynb
- 4.5 递归.ipynb
- 4.6 内置函数.ipynb
- 4.7 模块化程序设计.ipynb
- 5.1 序列通用操作.ipynb
- 5.1.1 索引.ipynb
- 5.1.2 切片.ipynb
- 5.1.3 序列拼接与重复.ipynb
- 5.1.4 成员测试.ipynb
- 5.2.1 字符串的创建.ipynb
- 5.2.2 字符串常量.ipynb
- 5.2.4 字符串的遍历.ipynb
- 5.2.5 文件遍历.ipynb
- 5.2.6 字符串的处理方法.ipynb
- 5.2.7 字符串格式化.ipynb
- 5.2.8 转义字符.ipynb
- 5.3 random 模块及其应用.ipynb
- 6.1 元组.ipynb
- 6.2 列表.ipynb
- 6.2.1 列表的创建.ipynb
- 6.2.2 列表的更新.ipynb
- 6.2.3 列表的删除.ipynb
- 6.2.4 列表的排序.ipynb
- 6.2.5 列表赋值与复制.ipynb
- 6.2.6 列表推导式.ipynb
- 6.2.8 常用内置函数.ipynb
- 6.2.9 列表嵌套及其排序.ipynb
- 6.3 列表综合应用.ipynb
- 7.1.1 集合的创建.ipynb
- 7.1.2可变集合类型的操作.ipynb
- 7.1.3 成员关系.ipynb
- 7.1.4 集合关系.ipynb
- 7.1.5 集合运算.ipynb
- 7.2.1 字典创建.ipynb
- 7.2.2 获取字典值.ipynb
- 7.2.3 修改字典值.ipynb
- 7.2.4内置函数与方法.ipynb
- 7.2.5字典排序输出.ipynb
- 7.3 集合与字典的应用.ipynb
- 8 中 numpy 概述.ipynb
- 8 中panda 库.ipynb
- 8.1 文件的打开与关闭.ipynb
- 8.2 文件读写操作.ipynb
- 8.3 文件的应用.ipynb
- 8.4 numpy 文件操作.ipynb
- 8.4.2 and 3.ipynb
- 8.5.1 pandas文件读写.ipynb
- 8.5.2 and 3 and 4.ipynb
- 9.1 matplotlib 线性图.ipynb
- 9.1.5 数据文化绘图.ipynb
- 9.2 非线性图.ipynb
- 9.3 词云.ipynb
- _overview.md
- _readme.ipynb
- coding_here.ipynb
- dream.png
- score.txt
- score_total.csv
- 成绩分析综合.json
7.1.5 集合运算.ipynb @master — view markup · raw · history · blame
7.5 集合运算¶
Python中的集合和数学中的集合概念基本一致,也支持集合的交、差、并等操作,使用这些运算可以很方便的处理数学中的集合操作。集合运算的方法与含义如下表所示。
| 操作方法 | 符号 | 含义 |
|---|---|---|
| s.union(t) | s | t | 返回集合s和t的并集</br>返回一个新集合,其中包含来自原集合以及 t 指定的所有集合中的元素。 |
| s.intersection(t) | s & t | 返回集合s和t的交集 </br> 返回一个新集合,其中包含原集合以及 t 指定的所有集合中共有的元素。 |
| s.difference(t) | s –t | 返回集合s和t的差</br> 返回一个新集合,其中包含原集合中在 t 指定的其他集合中不存在的元素。 |
| s.symmetric_difference(t) | s ^ t | 返回集合s和t的对称差,即存在于s和t中的非交集数据</br> 返回一个新集合,其中的元素或属于原集合或属于 t 指定的其他集合,但不能同时属于两者。 |
| s.update(t) | s = s | t | s中的元素更新为属于 s 或 t 的成员,即 s与 t的并集。 |
| s.intersection_update(t) | s = s & t | s中的元素更新为共同属于 s和t的元素,即 s与 t的交集。 |
| s.difference_update(t) | s = s - t | s中的元素更新为属于 s 但不包含在 t 中的元素,即 s与 t的差集。 |
| s.symmetric_difference_update(t) | s = s ^ t | s中的元素更新为那些包含在 s 或 t 中,但不 是 s和 t 共有的元素。 |
使用集合操作方法时,参数可以是集合或可迭代数据对象;用符号操作时,参与运算的两个对象必须都是集合。
1. 并集¶
- s.union(t) :
返回一个新的集合,包含原集合s以及t指定的所有集合中的所有元素。参数t可以接受多个任何可迭代对象。 - s | t:
返回一个新的集合,包含集合s以及集合t中的所有元素。参与运算的两个对象必须都是集合。 - s.update(t):
无返回值,直接作用于集合对象s,s中包含原集合s以及t指定的所有集合中的所有元素。参数t可以接受多个任何可迭代对象。
In [2]:
s = set('bookshop')
t = set('cheeseshop')
new_set1 = s.union(t)
print(new_set1)
new_set2 = s | t
print(new_set2)

In [3]:
s = set('python')
new_set3 = s.union('programming', range(1,10)) # 参数t可以接受多个任何可迭代对象
print(new_set3)
In [3]:
s = set('bookshop')
t = set('cheeseshop')
print(s)
result = s.update(t) # 无返回值,直接作用于集合对象s,等价于s = s | t
print(result, s) # None {'k', 'n', 't', 'p', 'h', 'y', 'o', 's', 'b'}

2. 交集¶
- s.intersection(t):
返回一个新的集合,该集合中的每个元素同时是s和t指定的所有集合中的成员。参数t可以接受多个任何可迭代对象。 - s & t:
返回一个新的集合,该集合中的每个元素同时是s和t两个集合中的成员。参与运算的两个对象必须都是集合。 - s.intersection_update(t):
无返回值,直接作用于集合对象s,s中包含的元素同时是原s和t指定的所有集合中的成员。参数t可以接受多个任何可迭代对象。
In [4]:
s = set('bookshop')
t = set('cheeseshop')
new_set1 = s. intersection(t)
print(new_set1)
new_set2 = s & t
print(new_set2)
通过上面的代码可以看出,对两个集合求交集,&运算符和intersection方法的作用是完全相同的,使用运算符的方式显然更直观且代码也更简短。
需要说明的是,集合的二元运算还可以跟赋值运算一起构成复合赋值运算,例如:
set1 |= set2
相当于:
set1 = set1 | set2
跟|=作用相同的方法是update;
set1 &= set2
相当于
set1 = set1 & set2
跟&=作用相同的方法是intersection_update,代码如下所示。
In [5]:
set1 = {1, 3, 5, 7}
set2 = {2, 4, 6}
set1 |= set2
# set1.update(set2)
print(set1) # {1, 2, 3, 4, 5, 6, 7}
set3 = {3, 6, 9}
set1 &= set3
# set1.intersection_update(set3)
print(set1) # {3, 6}
set2 -= set1
# set2.difference_update(set1)
print(set2) # {2, 4}

In [7]:
s = set('bookshop')
t = set('cheeseshop')
print(s)
result = s.intersection_update(t) # 无返回值,直接作用于集合对象s,等价于s = s & t
print(result, s) # None {'p', 'o', 'h', 's'}

3. 差集¶
- s.difference(t):
返回一个新的集合,该集合中的每个元素是s的成员,但不是t指定的所有集合中的成员。参数t可以接受多个任何可迭代对象。 - s - t:
返回一个新的集合,该集合中的每个元素是s的成员,但不是集合t的成员。参与运算的两个对象必须都是集合。 - s.difference_update(t):
无返回值,直接作用于集合对象s,s中包含的元素是原s的成员,但不是t指定的所有集合中的成员。参数t可以接受多个任何可迭代对象。
In [9]:
s = set('bookshop')
t = set('cheeseshop')
new_set1 = s.difference(t)
print(new_set1)
new_set2 = s - t
print(new_set2)

In [10]:
s = set('bookshop')
t = set('cheeseshop')
print(s)
result = s.difference_update(t) # 无返回值,直接作用于集合对象s,等价于s = s - t
print(result, s) # None {'b', 'k'}

4. 对称差集¶
- s.symmetric_difference(t):
返回一个新的集合,该集合中的每个元素或属于原集合s或属于t指定的其他集合,但不能同时属于两者。参数t可以接受多个任何可迭代对象。 - s ^ t:
返回一个新的集合,该集合中的每个元素或属于原集合s或属于集合t,但不能同时属于两者。参与运算的两个对象必须都是集合。 - s.symmetric_difference_update(t):
无返回值,直接作用于集合对象s,s中包含的元素或属于原集合s或属于t指定的其他集合,但不能同时属于两者。参数t可以接受多个任何可迭代对象。
In [13]:
s = set('bookshop')
t = set('cheeseshop')
new_set1 = s.symmetric_difference(t)
print(new_set1)
new_set2 = s ^ t
print(new_set2)

In [6]:
s = set('bookshop')
t = set('cheeseshop')
print(s)
result = s.symmetric_difference_update(t) # 无返回值,直接作用于集合对象s,等价于s = s ^ t
print(result, s) # None {'c', 'b', 'k', 'e'}

实例1: 手机销售分析¶
In [7]:
!tar -xvf /data/bigfiles/2b2d3026-228d-46e4-8216-cb5f684ff337.tar
文件“7.4 手机销售分析.xlsx”的Excel表中第1个工作薄2019手机销售上榜品牌及其份额数据(百分数),第2个工作薄2018手机销售上榜品牌及其份额数据(百分数)。读取文件中的数据,按销量输出每年销售榜单品牌、两年都上榜的品牌、两年上榜的所有品牌、2019新上榜品牌、2019新上榜与落榜品牌。
利用pandas库读取Excel文件中数据、用tolist()方法转为列表的方法可以获取其中的手机品牌列表,将其转为集合。excel 是要读取数据的文件名,sheet_name 是要读取的工作薄序号,1表示读取第2个工作薄,值缺省时读取第1个工作薄。values.tolist()可将dataframe类型数据转为列表类型,再利用集合推导式根据列表中的数据创建集合。
In [1]:
import pandas as pd
def data(excel):
"""接收Excel文件名,读excel文件中两个工作表,分别将数据放入两个集合并返回。"""
sale2018 = pd.read_excel(excel, sheet_name=1) # 读数据进dataframe
sale2018 = sale2018.values.tolist() # dataframe类型转列表
sale2019 = pd.read_excel(excel).values.tolist() # 两行语句也可以合并为一行,读取后直接将值转为列表
set2019 = {x[0] for x in sale2019} # 集合推导式,2019年榜单集合
set2018 = {x[0] for x in sale2018} # 集合推导式,2018年榜单集合
return set2019, set2018
利用集合的并、交、差补和对称差分可以完成题目要求的分析工作。
In [3]:
def rank(s2019, s2018):
"""接收两个集合为参数,做集合运算,输出两年都上榜的手机品牌、两年上榜的所有品牌、2019年新上榜品牌、新上榜与落榜品牌。"""
print(f'两年都上榜的手机品牌:{s2019 & s2018}') # 两年都上榜的手机,交集s.intersection(t)
print(f'两年上榜的所有品牌:{s2019 | s2018}') # 两年上榜的所有品牌,并集s.union(t)
print(f'2019年新上榜品牌:{s2019 - s2018}') # 新上榜品牌,差补s.difference(t)
print(f'新上榜与落榜品牌:{s2019 ^ s2018}') # 新上榜与落榜品牌,对称差分,s.symmetric_difference(t)
调用上面的函数实现题目要求。
In [4]:
if __name__ == '__main__':
excelName = '7.4 手机销售分析.xlsx' # 定义文件名,方便修改
saleSet2019, saleSet2018 = data(excelName) # 调用函数读数据转格式
rank(saleSet2019, saleSet2018) # 调用函数运算和输出