第45讲:Python集合对象生成式的概念以及应用案例

集合的生成式和集合的非常类似,只是符号不同而已,集合的语法格式如下,可以看到只是和集合的符号不同:

{
    
    集合元素的生成表达式 for 自定义的变量 in 可迭代对象}

集合元素的生成表达式,指的是生成集合中每一个元素的表达式,通常都会包含循环中的"自定义的变量"

1.什么是集合生成式

集合生成式用于快速创建出一个集合,根据指定的集合元素生成表达式,通过for-in循环遍历从而快速创建出集合。

例如我们想要生成集合{1, 4, 9, 16, 25, 36},除了直接创建外,还可以通过for-in循环。

myset = set()

for i in range(1,7):
    myset.add(i * i)
print(myset) 

'''
代码解释:
    首先定义一个空集合:myset = {}
    {1, 4, 9, 16, 25, 36}这个集合中的每个元素分别是1~6的平方,我们可以用range函数生成一个包含1~6的整数序列
    然后用for循环去遍历这个序列,每次遍历都将元素赋值给自定义变量i,每次循环的时候在集合myset中添加元素,元素值为i*i
    第一次循环,i的值为1,在集合中添加的元素就是1*1,第二次就是2*2,以此类推
'''

列表是无序存放的,因此返回的顺序不同也是合理的。

image-20220816221520580

3.使用集合生成式创建集合

通过for-in循环生成了一个集合,这算是一种比较常规的做法。针对快速创建集合,还有更好的解决方法,那就是使用集合生成式。

集合生成式可以理解为是for-in循环的简写语法,语法格式如下:

{
    
    集合元素的生成表达式 for 自定义的变量 in 可迭代对象}

集合元素的生成表达式,指的是生成集合中每一个元素的表达式,通常都会包含循环中的"自定义的变量"

凡是通过for-in循环创建的集合,都可以使用集合生成式来创建,语法相关简洁。

下面我们将for-in循环创建的集合{1, 4, 9, 16, 25, 36},通过集合生成式来创建。

myset = {
    
    i * i for i in range(1,7)}
print(myset)

'''
代码解释以及执行过程:
    代码生成式要放在{}中,其中i * i就是生成集合元素的表达式
    for i in range(1,7):通过for-in循环整数序列range(1,7),每次循环为自定义变量i赋值
    第一次循环i的值为1,表达式为:1*1,结果:1,表达式的计算结果作为元素然后添加到集合中
    第二次循环i的值为2,表达式为:2*2,结果:4,表达式的计算结果作为元素然后添加到集合中
    依次类推,直到for-in循环无可遍历的对象时循环结束,集合元素也随之添加完成
'''

使用集合生成式创建集合时,无需事先声明一个空集合,语法格式中的{}花括号就已经是在定义空集合了,在集合的生成式中,集合元素的表达式通常都包含for-in循环中的自定义变量,每次循环遍历的结果不同,根据表达式生成的集合元素也会不同。

集合生成式的执行过程:

  • 首先执行for-in循环部分的代码,遍历一个可迭代对象,为自定义变量赋值,表达式中会包含自定义的变量。
  • 表达式就相当于for-in循环的循环体,每次循环都对表达式赋值,通过计算生成具体的集合元素。
  • 每循环一次都会根据表达式生成集合元素,然后将其添加到集合中,直到for-in循环中无可遍历的对象时,集合创建完成。

for-in循环—>表达式—>生成集合元素—>添加到集合中。

编写生成式代码时,建议先写循环再写表达式。

下面我们通过集合生成式生成一个集合,集合中9个元素,全都是0,此时只会返回一个0,因为集合的元素是不允许重复的。

myset = {
    
    0 for i in range(1,10)}
print(myset)

'''
	0就作为表达式,每循环一次生成一个元素,添加到集合中,每循环一次都是0,本次循环的结果覆盖掉上次循环的结果,最终集合中只会有一个0
'''

#输出结果:{0}

3.在集合生成式中使用if语句

可以在集合生成式中使用if语句。

还是生成这个集合{1, 4, 9, 16, 25, 36},本次的需求是:循环时只对偶数进行遍历。

只对偶数遍历,那么只有偶数才会根据表达式计算生成元素,最终的集合就是:{4, 16, 36}

myset = {
    
    i * i for i in range(1,7) if not i % 2}
print(myset)

'''
代码解释:
写生成式时,建议先写for i in range(1,7)循环和if not i % 2条件判断,相对比较容易理解
    循环遍历range(1,7)这个迭代对象,每次遍历都将序列中的元素赋值给自定义变量i
    每次循环后执行循环体if not i % 2,i % 2的值如果为0,那么就说明i是偶数,可以使用表达式生成元素添加到集合内,0对应的布尔值是False,因此可以通过if not的方式判断i % 2的值是否是False,只有是False的时候才能使用表达式生成元素。
    1)第一次循环,i的值为1,执行循环体,1/2的余数不等于0,那么余数对应布尔值就是True,经过if not判断只有结果为False,才允许通过表达式生成元素,否则进入下一次循环。
    2)第二次循环,i的值为2,执行循环体,2/2的余数等于0,对应的布尔值就是False,经过if not判断结果为False,这时通过表达式i * i(2*2=4)生成元素4,添加到集合中,进入下一次循环。
    以此类推,直到for-in循环无可遍历的对象时,集合完成创建。
'''

#输出结果:{16, 4, 36}

image-20220816223018710

我们刚刚写的集合生成式等同于以下代码:

myset = set()

for i in range(1, 7):
    if not i % 2:
        myset.add(i * i)
        
print(myset)

由此可见,集合生成式就是for-in循环的简写语法,集合生成式会自动的将生成的元素添加到集合中,因此无需执行add方法。

4.在集合生成式中使用嵌套for循环语句

在集合生成式中还可以使用嵌套的for循环语句。

{
    
    ('jiangxl', 3), ('jiangxl', 2), ('wnagwu', 2), ('zhangsan', 1), ('wnagwu', 1), ('jiangxl', 1), ('zhangsan', 3), ('wnagwu', 3), ('zhangsan', 2)}

'''
代码解释:
    1)首先执行外层循环for u in user循环遍历user集合,每次遍历时将user集合中的元素赋值给变量u,内层循环for i in id作为内层循环的循环体,每次遍历时将id集合中的元素赋值给变量i
    2)(u, i)就是生成集合元素的表达式,每次执行到内层循环时,就会将变量u和i的值放在元组里,这个元组是集合中的一个元素。
    3)第一次外层循环u的值为jiangxl,循环体中内层循环的第一次遍历i的值为1(表达式生成的元素就是('jiangxl', 1)),第二次遍历i的值为2(表达式生成的元素就是('jiangxl', 2)),第三次遍历i的值为3(表达式生成的元素就是('jiangxl', 3)),内层循环全部遍历完后,外层循环进入第二次循环,u的值为wangwu,依次类推....
'''

#输出结果:{('jiangxl', 1), ('jiangxl', 2), ('jiangxl', 3), ('wnagwu', 1), ('wnagwu', 2), ('wnagwu', 3), ('zhangsan', 1), ('zhangsan', 2), ('zhangsan', 3)}

无论是集合生成式,还是单独的for-in循环,执行顺序都是不变的,先执行外层循环,然后再执行内层循环。

image-20220816223348473

集合生成式对应的for循环代码如下:

user = {
    
    'jiangxl', 'wnagwu', 'zhangsan'}
id = {
    
    1, 2, 3}
userex = set()

for u in user:
    for i in id:
        userex.add((u, i))

print(userex)

另外在生成式的嵌套for-in循环中还可以使用if语句,例如本次循环如果变量i的值为2,那么就不将其与变量u组合成元组添加到集合。

user = {
    
    'jiangxl', 'wnagwu', 'zhangsan'}
id = {
    
    1, 2, 3}
userex = {
    
    (u, i) for u in user for i in id if i != 2}
print(userex)

'''
代码解释:
    1)首先执行外层循环for u in user循环遍历user集合,每次遍历时将user集合中的元素赋值给变量u,内层循环for i in id作为内层循环的循环体,每次遍历时将id集合中的元素赋值给变量i,内层循环体是if判断if i != 2,当i的值不等于2时,再根据表达式生成集合中的元素。
    2)(u, i)就是生成集合元素的表达式,每次执行到内层循环时,就会将变量u和i的值放在元组里,这个元组是集合中的一个元素。
    3)第一次外层循环u的值为jiangxl,循环体中内层循环的第一次遍历i的值为1,i的值不等于2,此时表达式会生成元素('jiangxl', 1))
        第二次遍历i的值为2,当i等于2时,就不会生成元素了
        第三次遍历i的值为3,i不等于2,此时表达式会生成元素('jiangxl', 3))
      内层循环全部遍历完后,外层循环进入第二次循环,u的值为wangwu,依次类推....
'''

#输出结果:{('jiangxl', 1), ('zhangsan', 1), ('wnagwu', 1), ('jiangxl', 3), ('zhangsan', 3), ('wnagwu', 3)}

image-20220816223554375

这个集合生成式对应for-in代码如下:

user = {
    
    'jiangxl', 'wnagwu', 'zhangsan'}
id = {
    
    1, 2, 3}
userex = set()

for u in user:
    for i in id:
        if not i == 2:
            userex.add((u, i))
            
print(userex)

集合不支持多维集合的概念,因为集合中的元素必须是不可变的对象,而集合属于可变的类型,因此不支持多维集合的概念。

猜你喜欢

转载自blog.csdn.net/weixin_44953658/article/details/130698533
今日推荐