文章目录
- 1.什么是集合生成式
- 3.使用集合生成式创建集合
- 3.在集合生成式中使用if语句
- 4.在集合生成式中使用嵌套for循环语句
集合的生成式和集合的非常类似,只是符号不同而已,集合的语法格式如下,可以看到只是和集合的符号不同:
{集合元素的生成表达式 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,以此类推
'''
列表是无序存放的,因此返回的顺序不同也是合理的。
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}
我们刚刚写的集合生成式等同于以下代码:
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循环,执行顺序都是不变的,先执行外层循环,然后再执行内层循环。
集合生成式对应的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)}
这个集合生成式对应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)
集合不支持多维集合的概念,因为集合中的元素必须是不可变的对象,而集合属于可变的类型,因此不支持多维集合的概念。