目录
集合
1.1、集合的特点
Python中的集合类型数据结构是将各不相同的不可变数据对象无序地集中起来的容器,就像是将值抽离,仅存在键的字典。类似于字典中的键,集合中的元素都是不可重复的,并且是属于不可变类型,元素之间没有排列顺序。集合的这些特性,使得它独立于序列和映射类型之外,Python中的集合类型就相当于数学集合论中所定义的集合,人们可以对集合对象进行数学集合运算(并集、交集、差集等)。
集合中的元素是唯一的,重复的元素会被自动忽略。
集合是无序的,元素没有固定的位置。
集合中的元素必须是可哈希的,因此,只能包含不可变对象,如数字、字符串、元组等
1.2、可变集合
1.2.1、使用花括号创建可变集合
可变集合对象是可变的,可对其进行元素的增添、删除等处理,处理结果直接作用在对象上。使用花括号可以创建可变集合,这里与创建字典不同,传入的不是键值对,而是集合元素,注意,传入的元素对象必须是不可变的,即不能传入列表、字典甚至可变集合等。另外,可变集合的set函数能够将数据结构对象转换为可变集合类型,即将集合元素存储为一个列表或元组,再使用set函数转换为可变集合。在创建时,无须担心传入的元素是否重复,因为结果会将重复元素删除。若需要创建空集合,只能使用set 函数不传入任何参数进行创建。
# 使用花括号创建可变集合
set1 = {'A','C','D','B','A','B'}
1.2.2、使用函数创建可变集合
# 使用函数set()创建可变集合
set2 = set([2,3,1,4,False,2.5,'one']) # 把列表转换为集合,注意set函数只允许有一个可迭代对象作为参数!
1.2.3、创建空的可变集合
# 创建空可变集合,创建空集合只能使用set函数,而空的花括号创建的是空字典!
empty_set = set()
1.2.4、可变集合的用法
1、集合主要用于元素去重、成员关系测试(in/not in)、删除数据项等。
2、用于元素去重,例如可以把含有重复元素的列表list1通过list(set(list1)的方式实现自动去重,当然list1的元素一定是不可变类型才能用set函数转换。
3、因为元素无序,因此:
(1)不能访问,不能用索引或下标访问单个元素,只能整体打印输出;
(2)因为不能用索引或下标访问单个元素,因此无法对可变集合中的元素进行值的修改,只能增删元素,无法修改元素;
(3)输出的顺序可以与创建时的顺序不同
1.2.4.1、向集合中添加一个元素
set1 = {"apple", "banana", "cherry"}
set1.add("dog")
print(set1) # {'cherry', 'dog', 'apple', 'banana'}
1.2.4.2、向集合中添加多个元素
set1 = {"apple", "banana", "cherry"}
set2 = {"google", "run", "apple"}
lst2 = ["jack", "alex", "jack"]
dic2 = {"湖北": "武汉", "湖南": "长沙", "广东": "广州"}
tup2 = ("张三", "李四", "小明", "小红", "李四")
# 传入集合,将set2中的元素都添加到set1中,set1改变,set2没有改变
set1.update(set2) # {'banana', 'apple', 'google', 'cherry', 'run'}
# 传入列表,会把列表中重复的元素丢弃
set1.update(lst2) # {'cherry', 'jack', 'banana', 'apple', 'alex'}
# 传入字典,实际是把键添加进去
set1.update(dic2) # {'banana', '广东', 'apple', 'cherry', '湖北', '湖南'}
# 传入元组,会把元组中重复的元素丢弃
set1.update(tup2) # {'cherry', '小明', 'apple', '小红', 'banana', '李四', '张三'}
1.2.4.3、删除可变集合中的元素
set1 = {"apple", "banana", "cherry"}
set1.discard("apple") # 如果元素在集合中,则移除该元素,否则不做任何操作,没有返回值
set1.remove("apple") # 如果元素在集合中,则移除该元素,否则会引发 KeyError 错误,没有返回值
variable = set1.pop() # 随机移除并返回集合中的一个元素。如果集合为空,会引发 KeyError 错误
set1.clear() # 清空整个集合
1.2.5、集合间的数学运算
1.2.5.1、交集运算
set1 = {"apple", "banana", "cherry"}
set2 = {"google", "run", "apple"}
# 写法一:
variable = set1 & set2
# 写法二,这两种写法实际上是等价的:
variable = set1.intersection(set2)
1.2.5.2、补集运算
set1 = {"apple", "banana", "cherry"}
set2 = {"google", "run", "apple"}
# 交叉补集,返回两个集合(或集合与可迭代对象)中非共同元素组成的新集合
variable = set1 ^ set2
variable = set1.symmetric_difference(set2)
1.2.5.3、差集运算
set1 = {"apple", "banana", "cherry"}
set2 = {"google", "run", "apple"}
# 从set1中去除与set2相交的元素,返回一个新的集合,set1和set2没有改变
variable = set1 - set2
variable = set1.difference(set2)
# 从set1中去除与set2相交的元素,并赋值给原来的变量set1,及set1改变,set2没有改变
set1.difference_update(set2)
# 从set2中去除与set1相交的元素
variable = set2 - set1
variable = set2.difference(set1)
# 从set2中去除与set1相交的元素,并赋值给原来的变量set2,及set2改变,set1没有改变
set2.difference_update(set1)
1.2.5.4、并集运算
set1 = {"apple", "banana", "cherry"}
set2 = {"google", "run", "apple"}
variable = set1 | set2
variable = set1.union(set2)
1.2.6、集合间的判断
1.2.6.1、判断两个集合是否相交
set1 = {"apple", "banana", "cherry"}
set2 = {"google", "run", "apple"}
# 无交集返回True,有交集返回False
variable = set1.isdisjoint(set2)
1.2.6.2、判断A是否是B的子集
set1 = {"apple", "banana", "cherry"}
set2 = {"banana", "cherry", "google", "run", "apple"}
# set1是set2的子集 返回True,否则返回False
variable = set1.issubset(set2)
1.2.6.3、判断A是否是B的父集
set1 = {"apple", "banana", "cherry"}
set2 = {"banana", "cherry", "google", "run", "apple"}
# set2是set1的父集 返回True,否则返回False
variable = set2.issuperset(set1)
1.3、不可变集合
不可变集合对象属于不可变数据类型,不能对其中的元素进行修改处理。创建不可变集合的方法是使用frozenset函数。它与set函数用法一样,不同的是得出的结果是一个不可变集合。注意,元素必须为不可变数据类型。使用不可变集合作为元素,当frozenset函数不传入任何参数时,则会创建一个空不可变集合frozenset 是不可变的,一旦创建就不能修改。
1.3.1、使用函数创建不可变集合
# 使用函数frozenset()创建不可变集合
set1 = frozenset([3,2,3,'one',frozenset([1,2]),True])
1.3.2、创建空的不可变集合
# 创建空不可变集合
empty_frozenset = frozenset()