Python学习笔记(二十一) Python3集合

举报
菜鸟级攻城狮 发表于 2021/07/12 22:11:22 2021/07/12
【摘要】 史上最为详细的python学习笔记,记录学习过程的知识点和难点

'''
Python3集合
    集合(set)是一个无序的、不重复的元素序列。
    可以使用大括号 {} 或者 set() 函数创建集合。
    注意:创建一个空集合必须使用 set() 而非 {},因为 {} 是用来创建一个空字典。
    格式:
        parameter = {value1, value2, ...}
        或者
        set(value)
'''

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

可以使用大括号 {} 或者  set()  函数创建集合,

注意:创建一个空集合必须用 set()  而不是 {} ,因为  {} 是用来创建一个空字典。

创建格式:

parameter = {value01,value02,...}

或者

set(value)

类似列表推导式,同样集合支持集合推导式(Set comprehension):

实例(Python 3.0+)

>>> a = {for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

 

集合的基本操作

1、添加元素

语法格式如下:

s.add( x )

将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。

实例(Python 3.0+)

>>> thisset = set(("Google", "Runoob", "Taobao"))

# 若以上提示Function call can be replaced with set literal

# 替换为{'Google', 'Runoob', 'Taobao'}即可
>>> thisset.add("Facebook")
>>> print(thisset)
{'Taobao', 'Facebook', 'Google', 'Runoob'}

还有一个方法,也可以添加元素,且参数可以是列表,元组,字典等,语法格式如下:

s.update( x )

x 可以有多个,用逗号分开。

实例(Python 3.0+)

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.update({1,3})
>>> print(thisset)
{1, 3, 'Google', 'Taobao', 'Runoob'}
>>> thisset.update([1,4],[5,6])  
>>> print(thisset)
{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}
>>> 

2、移除元素

语法格式如下:

s.remove( x )

将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。

实例(Python 3.0+)

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.remove("Taobao")
>>> print(thisset)
{'Google', 'Runoob'}
>>> thisset.remove("Facebook")   # 不存在会发生错误
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError'Facebook'
>>> 

此外还有一个方法也是移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:

s.discard( x )

实例(Python 3.0+)

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.discard("Facebook")  # 不存在不会发生错误
>>> print(thisset)
{'Taobao', 'Google', 'Runoob'}

我们也可以设置随机删除集合中的一个元素,语法格式如下:

s.pop() 

脚本模式实例(Python 3.0+)

thisset = set(("Google", "Runoob", "Taobao", "Facebook"))
= thisset.pop()

print(x)

输出结果:

$ python3 test.py

Runoob

多次执行测试结果都不一样。

注意:set 集合的 pop 方法会对集合进行无序的排列,然后将这个无序排列集合的左面第一个元素进行删除。

3、计算集合元素个数

语法格式如下:

len(s)

计算集合 s 元素个数。

实例(Python 3.0+)

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> len(thisset)
3

4、清空集合

语法格式如下:

s.clear()

清空集合 s。

实例(Python 3.0+)

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.clear()
>>> print(thisset)
set()

5、判断元素是否在集合中存在

语法格式如下:

x in s

判断元素 x 是否在集合 s 中,存在返回 True,不存在返回 False。

实例(Python 3.0+)

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> "Runoob" in thisset
True
>>> "Facebook" in thisset
False
>>> 

集合内置方法完整列表

序号

方法及描述

1

set.add(elemnt)

为集合添加元素

2

set.clear()

移除集合中的所有元素

3

set.copy()

拷贝一个集合

4

set.difference(set)

返回多个集合的差集(-)

5

set.difference_update(set)

移除集合中的元素,该元素在指定的集合也存在。差集 

6

set.discard(value)

删除集合中指定的元素,移除不存在的元素时不会报错。

7

set.intersection(set1, set2...)

返回集合的交集(&)

8

set.intersection_update(set1, set2...)

返回集合的交集

9

set.isdisjoint(set)

判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。

10

set.issubset(set)

判断指定集合是否为该方法参数集合的子集 

11

set.issuperset(set)

判断该方法的参数集合是否为指定集合的子集 

12

set.pop()

随机移除元素

13

set.remove(item)

移除指定元素,移除不存在的元素时会报错。

14

set.symmetric_difference(set)

返回两个集合中不重复的元素集合 对称差集(^)

15

set.symmetric_difference_update(set)

移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。对称差集 

16

set.union(set1, set2...)

返回两个集合的并集(|)

17

set.update(set)

给集合添加元素

python 字符串操作方法详解

https://www.cnblogs.com/wj-1314/p/8419009.html

python 列表操作方法详解

https://www.cnblogs.com/wj-1314/p/8433116.html

python 字典操作方法详解

https://www.cnblogs.com/wj-1314/p/8421724.html

python 集合操作方法详解

https://www.cnblogs.com/wj-1314/p/8423273.html

# 3、计算集合元素个数:

# len(s):计算集合s元素个数
set_f = {'Google', 'Runoob', 'Taobao'}
print(len(set_f))


# 4、清空集合
# s.clear():清空集合s
set_g = {'Google', 'Runoob', 'Taobao'}
print(set_g.clear())    # 打印结果:None


# 5、判断元素是否在集合中
# x in s:判断元素x是否在集合s中,存在返回True,不存在返回False
set_h = {'Google', 'Runoob', 'Taobao'}
print('Google' in set_h)

'''集合内置方法完整列表示例'''
# 1add()
'''
描述:
    add()方法用于给集合添加元素,如果添加的元素在集合中,则不进行任何操作。
语法:
    set.add(elmnt)
参数:
    elmnt--必须,要添加的元素
返回值:
    
'''

fruit = {'apple', 'orange', 'peach'}
fruit.add('watermelon')
print(fruit)

fruit.add('apple')      # 元素已存在,不执行任何操作
print(fruit)

fruit.add(('grape'))    # add()支持元组,不支持列表、字典
print(fruit)

# 2clear()
'''
描述:
    clear()方法用于移除集合中的所有元素
语法:
    set.clear()
参数:
    
返回值:
    
'''

fruit = {'apple', 'orange', 'peach'}
fruit.clear()
print(fruit)        # 输出结果为:set()

 

# 3copy()
'''
描述:
    copy()方法用于拷贝一个集合
语法:
    set.copy()
参数:
    
返回值:
    
'''

fruits = {'apple', 'banana', 'cherry'}
x = fruits.copy()
print(id(fruits), fruits)
# 2441491078720 {'banana', 'cherry', 'apple'}   地址不一样,内容一样
print(id(x), x)
# 2441491078496 {'banana', 'cherry', 'apple'}   地址不一样,内容一样

 

# 4difference():差集(-)
'''
描述:
    difference()方法用于返回集合的差集,
    即返回一个新集合,元素在x集合而不在y集合

语法:
    set.difference(set)
参数:
    set--必须,用于计算差集的集合
返回值:
    返回一个新的集合
'''

# set.difference(set):返回多个集合的差集,返回一个新集合,元素在x集合而不在y集合
x = {'apple', 'orange', 'peach'}
y = {'watermelon', 'grape', 'peach'}
z = x.difference(y)
print(z)

# 类似
print(x - y)

# 5difference_update():差集
'''
描述:
    difference_update()方法用于移除两个集合中都存在的元素,即返回差集。
    
    difference_update()difference()的区别:
        前者是直接在原来的集合中移除元素,没有返回值;
        后者返回 一个移除相同元素的新集合。
语法:
    set.difference_update(set)
参数:
    set--必须,用于计算差集的集合
返回值:
    
'''

x = {'apple', 'banana', 'cherry'}
y = {'google', 'microsoft', 'apple'}
x.difference_update(y)
print(x)    # {'banana', 'cherry'}



# 6discard()
'''
描述:
    discard()方法用于移除指定的集合元素。
    该方法不同于remove()方法,因为remove()方法在一处一个不存在的元素时会发生错误,而discard()方法不会。
语法:
    set.discard(value)
参数:
    value--必须,要移除的元素
返回值:
    
'''

fruits = {'apple', 'banana', 'cherry'}
fruits.discard('banana')     # 删除已存在的元素
print(fruits)                  # {'cherry', 'apple'}
fruits.discard('watermelon')# 删除不存在的元素,不会报错



# 7intersection():交集(&)
'''
描述:
    intersection()方法用于返回两个或多个集合中都包含的元素,即交集。
语法:
    set.intersection(set1, set2, ...etc)
参数:
    set1--必须,要查找相同元素的集合
    set2--可选,其他要查找相同元素的集合,可以多个,多个使用逗号隔开
返回值:
    返回一个新的集合
'''

x = {'apple', 'orange', 'peach'}
y = {'watermelon', 'grape', 'peach'}
z = {'banana', 'ananas', 'peach'}
result = x.intersection(y, z)
print(result)

# 类似于
print(x & y & z)

# 思考如下例子
print(x & y | z)

 

# intersection(set)中,set参数可以不是集合,可以是任何序列。
x = {1, 2, 3, 4, 'a', 5.6}

y = x.intersection('a')     # str类型
print(y)                    # {'a'}

y2 = x.intersection([2])    # list类型
print(y2)                   # {2}

y3 = x.intersection((2,))   # tuple类型
print(y3)                   # {2}

# 而对字典则是与字典的key值比较:
y4 = x.intersection({'a': 2})
print(y4)                   # {'a'}
y5 = x.intersection({1: 2})
print(y5)                   # {1}

 


# 8intersection_update():交集
'''
描述:
     intersection_update()方法用于获取两个或多个集合中都重叠的元素,即计算交集。
     
     intersection_update()intersection的区别:
        前者是在原始的集合上移除不重叠的元素,没有返回值;
        后者返回一个新的集合。
语法:
    set.intersection_update(set1, set2, ...etc)
参数:
    set1--必须,要查找相同元素的集合
    set2--可选,其他要查找相同元素的集合,可以多个,多个使用逗号隔开
返回值:
    
'''

x = {"apple", "banana", "cherry"}   # y 集合不包含 banana  cherry,被移除
y = {"google", "runoob", "apple"}
z = {'watermelon', 'pumpkin', 'apple'}
result = x.intersection(y, z)
print(result)    # {'apple'}



# 9isdisjoint()
'''
描述:
    isdisjoint()方法用于判断两个集合是否包含相同的元素,如果没有返回True,否则返回False
语法:
    set.isdisjoint(set1)
参数:
    set--必须,要比较的集合
返回值:
    返回布尔值,如果不包含返回True,否则返回False
'''

x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "baidu"}
z = {'watermelon', 'pumpkin', 'apple'}
result = x.isdisjoint(y)
print(result)       # 不包含,返回True
result2 = x.isdisjoint(z)
print(result2)      # 包含,返回False

 


# 10issubset():子集
'''
描述:
    issubset()方法用于判断集合的所有元素是否都包含在指定集合中,
     x 是否包含在 y 中,如果是则返回True,否则返回False
语法:
    set.issubset(set)
参数:
    set--必须,要查找的集合
返回值:
    返回布尔值,如果都包含返回True,否则返回False
'''

x = {"a", "b", "c"}
y = {"f", "e", "d", "c", "b", "a"}
z = {"f", "e", "d", "c", "b"}
result = x.issubset(y)
print(result)       # x 包含在 y 中,返回True

result2 = x.issubset(z)
print(result2)      # x 不包含在 y 中,返回False



# 11issuperset():父集
'''
描述:
    issuperset()方法用于判断指定集合的所有元素是否都包含在原始的集合中,
     y 是否包含在 x 中,如果是则返回True,否则返回False
语法:
    set.issuperset(set)
参数:
    set--必须,要查找的集合
返回值:
    返回布尔值,如果都包含返回True,否则返回False
'''

x = {"f", "e", "d", "c", "b", "a"}
y = {"a", "b", "c"}
z = {"f", "e", "d", "c", "b"}
result1 = x.issuperset(y)
print(result1)      # y 包含在 x 中,返回True

result2 = z.issuperset(y)
print(result2)      # y 不包含在 z 中,返回False



# 12pop()
'''
描述:
    pop()方法用于随机移除一个元素,一般是移除左边第一个元素。
语法:
    set.pop()
参数:
    
返回值:
    返回移除的元素
'''

fruits = {'apple', 'banana', 'cherry'}
x = fruits.pop()
print('被移除的元素:', x) # 被移除的元素: cherry
print(fruits)            # {'apple', 'banana'}

print('--------- 分割线 ---------')
### pop()方法的规律总结:
s1 = {2, 5, 7, 4}               # 集合里只有数字
s2 = {'', '', '', '大家'}  # 集合里无数字
s3 = {3, 5, 2.9, '', 'X', 'Y'}  # 集合里既有数字又有非数字

s1.pop()    # 元素是数字时,删除最小的数字,其余数字升序排列
s2.pop()    # 元素非数字时,随即删除一个元素,其余元素随机排序
s3.pop()    # 元素既有数字又有非数字时,若删除的是数字,则一定删除最小的,否则随机删除一个非数字元素
print(s1)
print(s2)
print(s3)
# 多次运行观察打印结果
'''
总结:
    1、如果集合的元素都是数字, 删除时, 删掉的是最小的数字, 其余数字升序排列。
    2、如果集合的元素是非数字, 删除时, 删掉的是随机的元素, 其余元素随机排列。
    3、如果集合里既有数字又有非数字元素时:
        ·若删掉的是数字, 则一定是删掉了最小的, 其他数字升序排列, 非数字元素随机排列;
        ·若删掉的非数字, 则一定是随机删掉了一个, 其他数字升序排列, 非数字则随机排列。
'''



# 13remove()方法用于移除集合中的指定元素:

'''
描述:
    remove()方法用于移除集合中的指定元素
    该方法不同于discard()方法,因为remove()方法在移除一个不存在的元素时会报错,而discard()方法不会报错。
语法:
    set.remove(item)
参数:
    item--要移除的元素
返回值:
    
'''

fruits = {'apple', 'banana', 'cherry'}
fruits.remove('banana')
print(fruits)   # {'apple', 'cherry'}
# fruit.remove('peach')      # 不存在则报错:KeyError: 'peach'


# 14symmetric_difference():对称差集(^)
'''
描述:
    symmetric_difference()方法返回两个集合中不重复的元素集合,即会移除两个集合中都存在的元素。
语法:
    set.symmetric_difference(set)
参数:
    set--集合
返回值:
    返回一个新的集合
'''

x6 = {'apple', 'orange', 'peach'}
y6 = {'watermelon', 'grape', 'peach'}
result6 = x6.symmetric_difference(y6)
print(result6)

# 等同于
print(x6 ^ y6)


# 15symmetric_difference_update()
'''
描述:
    symmetric_difference_update()方法移除当前集合中在另一个指定集合相同的元素,
    并将另一个指定集合中不同的元素插入到当前集合中。
语法:
    set.symmetric_difference_update(set)
参数:
    set--要检测的集合
返回值:
    
'''

x7 = {'apple', 'orange', 'peach'}
y7 = {'watermelon', 'grape', 'peach'}
x7.symmetric_difference_update(y7)
print(x7)

# 16union():并集(|)
'''
描述:
    union()方法返回两个集合的并集,即包含了所有集合的元素,重复的元素只会出现一次。
语法:
    set.union(set1, set2, ...)
参数:
    set1--必须,合并的目标集合
    set2--可选,其他要合并的集合,可以多个,多个使用逗号隔开
返回值:
    返回一个新集合。
'''

x8 = {'apple', 'orange', 'peach'}
y8 = {'watermelon', 'grape', 'peach'}
z8 = {'banana', 'ananas', 'peach'}
result8 = x8.union(y8, z8)
print(result8)


# 17update()
'''
描述:
    update()方法用于修改当前集合,可以添加新的元素或集合到当前集合中,
    如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。
语法:
    set.update(set)
参数:
    set--必须,可以是元素或集合
返回值:
    
'''

x9 = {'apple', 'orange', 'peach'}
y9 = {'watermelon', 'grape', 'peach'}
x9.update({'pear'})   # 新添加的元素被分隔后添加到集合中
print(x9)   # 不加集合{}的字符串,结果:{'peach', 'apple', 'e', 'p', 'orange', 'r', 'a'}

x9.update(y9)
print(x9)

Python集合推导式  

字典推导式的语法格式如下:

{表达式 for 迭代变量 in 可迭代对象 [if条件表达式]} # []中内容可有可无

集合是无序不重复,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样.

从上面的代码中可以总结:

集合推导式就是将列表推导式的[ ]换成{ },字典推导式就是推导出两个值并构建成键值对的样子.

另外,不管是字典推导式还是集合推导式,后面都可以像列表推导式一样接if条件语句,嵌套循环等,具体可以根据您自己的需求来使用.

'''集合推导式'''
# 遍历一个可迭代对象生成集合
set_a = {value for value in '有人风轻云淡,有人负重前行'}
print(set_a)

square = {x ** 2 for x in [2, 2, 3, 4, 5, 6]}
print(square)

# 用集合推导式建立字符串长度的集合
strings = ['a', 'is', 'with', 'if', 'file', 'exception']
set_len = {len(s) for s in strings} # 长度相同的只留一个,这在实际上非常有用
print(set_len)

# 一个由男生和女生列表组成的嵌套列表,取出姓名中带有两个以上字母e名字,组成列表
names = [
    ['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],
    ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']
]
# for循环实现:
tmp = []
for lst in names:
    for name in lst:
        if name.count('e') >= 2:
            tmp.append(name)

print(tmp)    # ['jefferson', 'wesley', 'steven', 'jennifer']

# 用推导式嵌套列表实现:
result1 = [name for lst in names for name in lst if name.count('e') >= 2]
print(result1)  # ['jefferson', 'wesley', 'steven', 'jennifer']

# result1 = [[name for lst in names]for name in lst if name.count('e') >= 2]    # 这个式子该怎么写这个语句是错误的,正确语句如下

result2 = [[name for name in lst  if name.count('e') >= 2] for lst in names]
print(result2)  # [['jefferson', 'wesley', 'steven'], ['jennifer']]

 

'''
小练习:
    1、产生101~20的随机数,去除里面的重复项
    2、键盘输入一个数,将该数从不重复的集合中删除
'''

import random

set1 = set()
i = 1
while i <= 10:
    rand = random.randint(1, 20)
    if rand not in set1:
        set1.add(rand)
        i += 1

print(set1, len(set1))  
# {3, 6, 7, 8, 13, 15, 16, 18, 19, 20} 10

num = int(input('输入一个要删除的数字:')) # 需强转为int
if num in set1:
    set1.remove(num)
    #
    # set1.discard(num)
    print(set1, len(set1))  
    # 输入3后,{6, 7, 8, 13, 15, 16, 18, 19, 20} 9
else:
    print('集合里不存在该数!')

 

set1 = {2, 3, 4, 5}
set2 = {2, 3, 4, 5}

print(id(set1), id(set2))   # 查看两个集合的地址
print(set1 == set2)     # 判断两个集合中的内容是否相等

print(set1 != set2)     # 判断两个集合中的内容是否不相等

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200