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

网友投稿 783 2022-05-29

'''

Python3集合

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

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

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

格式:

parameter = {value1, value2, ...}

或者

set(value)

'''

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

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

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

创建格式:

parameter = {value01,value02,...}

或者

set(value)

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

实例(Python 3.0+)

>>> a = {x 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 "", line 1, in 

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"))

x = 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)

'''集合内置方法完整列表示例'''

# 1、add():

'''

描述:

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)

# 2、clear():

'''

描述:

clear()方法用于移除集合中的所有元素

语法:

set.clear()

参数:

返回值:

'''

fruit = {'apple', 'orange', 'peach'}

fruit.clear()

print(fruit)        # 输出结果为:set()

# 3、copy():

'''

描述:

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'}   地址不一样,内容一样

# 4、difference():差集(-)

'''

描述:

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)

# 5、difference_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'}

# 6、discard():

'''

描述:

discard()方法用于移除指定的集合元素。

该方法不同于remove()方法,因为remove()方法在一处一个不存在的元素时会发生错误,而discard()方法不会。

语法:

set.discard(value)

参数:

value--必须,要移除的元素

返回值:

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

'''

fruits = {'apple', 'banana', 'cherry'}

fruits.discard('banana')     # 删除已存在的元素

print(fruits)                  # {'cherry', 'apple'}

fruits.discard('watermelon')# 删除不存在的元素,不会报错

# 7、intersection():交集(&)

'''

描述:

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}

# 8、intersection_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'}

# 9、isdisjoint():

'''

描述:

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

# 10、issubset():子集

'''

描述:

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

# 11、issuperset():父集

'''

描述:

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

# 12、pop():

'''

描述:

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、如果集合里既有数字又有非数字元素时:

·若删掉的是数字, 则一定是删掉了最小的, 其他数字升序排列, 非数字元素随机排列;

·若删掉的非数字, 则一定是随机删掉了一个, 其他数字升序排列, 非数字则随机排列。

'''

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

'''

描述:

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

该方法不同于discard()方法,因为remove()方法在移除一个不存在的元素时会报错,而discard()方法不会报错。

语法:

set.remove(item)

参数:

item--要移除的元素

返回值:

'''

fruits = {'apple', 'banana', 'cherry'}

fruits.remove('banana')

print(fruits)   # {'apple', 'cherry'}

# fruit.remove('peach')      # 不存在则报错:KeyError: 'peach'

# 14、symmetric_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)

# 15、symmetric_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)

# 16、union():并集(|)

'''

描述:

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)

# 17、update():

'''

描述:

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、产生10个1~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)     # 判断两个集合中的内容是否不相等

Python

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用Python调用ManageOne运营API
下一篇:【云驻共创】云享 MindTalks · 第十七期--探索性数据分析方法
相关文章