08. 集合

一、什么是集合

  在 Python 中,集合与列表类似,集合它是无序(不是按照元素的插入顺序保存)的可变序列。在集合中不能出现重复的元素。在形式上,集合的所有元素都放在一对 “{}” 中,两个相邻元素间使用 “,” 分隔。集合中的元素只能是不可变类型的数据类型,也就是可哈希类型。

二、集合的创建、删除和遍历

2.1、集合的创建

【1】、通过 {} 创建集合

  我们可以通过 {} 来创建集合,同其它类型的 Python 变量一样,创建集合时,也可以使用赋值运算符“=”直接将一个集合赋值给变量,语法格式如下:

setname = {element1, element2, ...}

  在 Python 中,集合使用一对花括号将所有的元素括起来,多个元素之间用逗号分开。

names= {"Sakura", "Mikoto", "Shana", "Sakura"}
print(names)
print(type(names))

  集合中只能存放不可变对象,否则会报错。

TypeError: unhashable type: 'list'

【2】、通过 set() 方法创建集合

  我们还可以通过使用 set() 函数来一个创建空集合它的语法格式如下:

setname = set()
names = set()
print(names)
print(type(names))

  我们可以通过 set() 将序列或者字典转换为集合。

# 通过set()将列表转换为集合
names = set(["Sakura", "Mikoto", "Shana", "Sakura"])
print(names)
print(type(names))
print()

# 通过set()将元组转换为集合
ages = set((10, 14, 15, 10))
print(ages)
print(type(ages))
print()

# 通过set()将字符串转换为集合
s = set("hello")
print(s)
print(type(s))
print()

# 使用set()将字典转换为集合时,只会包含字典中的键
person = set({"name": "Sakura", "age": 10, "gender": '女'})
print(person)
print(type(person))

2.2、集合的删除

  对于已经创建好的集合,不再使用时,可以使用 del 语句将其删除,语法格式如下:

del setname

  在删除集合前,一定要保证的输入的集合对象是已经存在的,否则会出现以下错误:

NameError: name 'names' is not defined

2.3、遍历集合

  遍历集合,指的就是将集合中的所有元素取出来,在 Python 中我们可以通过 for 循环来遍历集合。

for element in setname:
    # 集合的遍历操作
names= {"Sakura", "Mikoto", "Shana", "Rimuru"}
for name in names:
    print(name)

三、集合中的元素增删查

3.1、向集合中添加元素

  我们可以通过 add() 可以向集合中添加元素。如果待添加的元素已经存在于集合中,则不会对集合做任何操作。如果待添加的元素不存在,则向集合中添加这个元素。语法格式如下:

setname.add(value)
names= {"Sakura", "Mikoto", "Shana"}
print(names)

names.add("Rimuru")
print(names)

names.add("Rimuru")
print(names)

3.2、删除集合中的元素

【1】、通过 pop() 方法删除集合中的元素

  我们可以使用 pop() 随机删除集合中的元素,它会将被删除的元素返回。语法格式如下:

x = setname.pop()
names= {"Sakura", "Mikoto", "Shana", "Rimuru"}
name = names.pop()
print(name)
print(names)

【2】、通过 remove() 方法删除集合中的元素

  我们还可以使用 remove() 删除集合中的指定元素。

setname.remove(x)
names= {"Sakura", "Mikoto", "Shana", "Rimuru"}
names.remove("Shana")
print(names)

  如果删除集合中不存在的元素会报错。

KeyError: 'Akame'

【3】、通过 discard() 方法删除集合中的元素

  我们可以通过 discard() 方法删除集合中的指定元素,如果元素不存在,则什么也不做。

setname.discard(x)
names= {"Sakura", "Mikoto", "Shana", "Rimuru"}
names.discard("Shana")
print(names)

3.3、查询集合中的元素

  在 Python 中,我们还可以使用 in 关键字检查集合中是否包含指定的键。如果存在,返回 True,否则返回 False。

element in setname
names= {"Sakura", "Mikoto", "Shana"}
result = "Sakura" in names
print(result)

  另外,在 Python 中,我们还可以使用 not in 关键字实现检查集合中是否不包含指定的元素。如果不在,返回 True,否则返回 False。

element not in setname
names= {"Sakura", "Mikoto", "Shana"}
result = "Sakura" not in names
print(result)

3.3、清空集合

  我们可以使用 clear() 来清空集合。语法格式如下:

setname.clear()
names= {"Sakura", "Mikoto", "Shana"}
print(names)
names.clear()
print(names)

四、集合的运算

4.1、交集、并集、差集与对称集

 集合最常用的操作就是 交集并集差集对称差集 运算。我们可以通过如下的方法实现:

setname.intersection(*others)                                                   # 交集,返回一个新的集合
setname.union(*others)                                                          # 并集,返回一个新的集合
setname.difference(*others)                                                     # 差集,返回一个新的集合
setname.symmetric_difference(other)                                             # 对称差集,返回一个新的集合
names1 = {"Sakura", "Mikoto", "Shana"}
names2 = {"Sakura", "Rimuru", "Akame"}

# 交集运算,A集合和B集合中都有的元素
names = names1.intersection(names2)
print(names)

# 并集运算,A集合和B集合中的所有元素
names = names1.union(names2)
print(names)

# 差值运算,只在A集合中有的元素,不在B集合中有的元素
names = names1.difference(names2)
print(names)

# 对称差集运算,A集合和B集合中不同的元素
names = names1.symmetric_difference(names2)
print(names)

  我们还可以通过符号进行集合的运算。进行 交集运算 时还使用 “&” 符号;进行 并集运算 时还使用 “|” 符号;进行 差集运算 时还使用 “-” 符号;进行 对称差集运算 时还使用 “^” 个符号。对集合做运算时,不会影响原来的集合,而是将运算结果返回。

names1 = {"Sakura", "Mikoto", "Shana"}
names2 = {"Sakura", "Rimuru", "Akame"}

# 交集运算,A集合和B集合中都有的元素
names = names1 & names2
print(names)

# 并集运算,A集合和B集合中的所有元素
names = names1 | names2
print(names)

# 差值运算,只在A集合中有的元素,不在B集合中有的元素
names = names1 - names2
print(names)

# 对称差集运算,A集合和B集合中不同的元素
names = names1 ^ names2
print(names)

  如果我们想在原有的集合上进行操作,可通过如下的方法。

setname.intersection_update(*others)                                            # 交集,在原有的集合上修改
setname.difference_update(*others)                                              # 差集,在原有的集合上修改
setname.symmetric_difference_update(other)                                      # 对称差集,在原有的集合上修改
names = {"Sakura", "Rimuru", "Akame"}

# 交集运算,A集合和B集合中都有的元素
names1 = {"Sakura", "Mikoto", "Shana"}
names1.intersection_update(names)
print(names1)

# 差值运算,只在A集合中有的元素,不在B集合中有的元素
names1 = {"Sakura", "Mikoto", "Shana"}
names1.difference_update(names)
print(names1)

# 对称差集运算,A集合和B集合中不同的元素
names1 = {"Sakura", "Mikoto", "Shana"}
names1.symmetric_difference_update(names)
print(names1)

4.2、子集、超集、真子集与真超集

【1】、子集 与 超集

  我们还可以使用 <= 检查一个集合是否是另一个集合的 子集,使用 >= 检查一个集合是否是另一个集合的 超集。如果 a 集合中的元素全部都在 b 集合中出现,那么 a 集合就是 b 集合的 子集,b 集合是 a 集合的 超集

a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
c = {1, 3, 5, 7, 9}
d = {1, 2, 3}
e = {1, 2, 3, 4, 5}

print("a <= b", a <= b)
print("a <= c", a <= c)
print("a <= d", a <= d)
print()

print("b >= a", b >= a)
print("b >= c", b >= c)
print("b >= e", b >= e)

【2】、真子集 与 真超集

  我们还可以使用 < 检查一个集合是否是另一个集合的 真子集,使用 > 检查一个集合是否是另一个集合的 真超集。如果 超集b 中含有 子集a 中的所有元素,并且 b 中还有 a 中没有的元素,则 b 就是 a 的 真超集,a 是 b 的 真子集

a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
c = {1, 3, 5, 7, 9}
d = {1, 2, 3}
e = {1, 2, 3, 4, 5}

print("a < b", a < b)
print("a < c", a < c)
print("a < d", a < d)
print()

print("b > a", b > a)
print("b > c", b > c)
print("b > e", b > e)

五、集合的通用操作

【1】、获取集合中元素的个数

  在 Python 中,可以使用 len() 获取集合中元素的个数。语法格式如下:

len(x)                                                                          # 获取集合中元素的个数
names= {"Sakura", "Mikoto", "Shana"}
print(len(names))

【2】、对集合进行浅复制

  在 Python 中,提供了 copy() 对集合对象进行浅复制,复制以后的对象和原对象是独立的,修改一个不会影响另一个。浅复制只会简单的复制对象内部的值,如果值也是一个可变对象,这个可变对象不会被复制。语法如下:

setname.copy()                                                                  # 对集合进行浅复制
names1 = {"Sakura", "Mikoto", "Shana", "Rimuru"}
names2 = names1.copy()

print("names1: ", names1)
print("names1 id: ", id(names1))

print("names2: ", names2)
print("names2 id: ", id(names2))

【3】、集合的扩展

  我们可以通过 update([other]) 将其它集合中的元素添加到当前集合中,如果有重复的元素,则不会添加。语法格式如下:

setname.update([other])                                                         # 将其它集合添加到当前集合中
s1 = {'a', 'b', 'c'}
s2 = {'d', 'e', 'f'}
s1.update(s2)
print(s1)

s3 = ('g', 'h', 'i')
s1.update(s3)
print(s1)

【4】、判断两个集合是否独立

setname.isdisjoint(other)                                                       # 判断两个集合是否独立
names1 = {"Sakura", "Mikoto", "Shana"}
names2 = {"Rimuru", "Akame"}

print(names1.isdisjoint(names2))

九、集合推导式

  使用集合推导式可以快速生成一个元组,它的表现形式和列表推导式类似,只是将列表推导式中的方括号 “[]” 修改为花括号 “{}”。

setname = {表达式 for 变量 in 可迭代对象 if 条件}
num = {value**2 for value in range(1,11)}
print(num)
print(type(num))
num = {value for value in range(1,11) if value % 2 == 0}
print(num)
print(type(num))

集合推导式得到的集合没有重复的数据,且顺序是无序的;

posted @ 2024-09-20 18:23  星光映梦  阅读(21)  评论(0)    收藏  举报