列表生成式
单参数
生成一个列表,元素为1,4,9,16,……,100。
lists = [n*n for n in range(1, 11)]
print(lists)
多参数
生成一个列表,元素为1*2,2*3,3*4,4*5,……。
lists = [x*y for x,y in zip(range(1,11), range(2, 12))]
print(lists)
这里用到了zip函数,函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
多重循环
写多个for循环,其中循环之间是嵌套的关系。如下代码,是生成0至99的字符串的列表。当然嵌套层数可以不止两层。
lists = [str(x)+str(y) for x in range(10) for y in range(10)]
print(lists)
带if判断
生成0至99的字符串的列表,其中十位数和个位数不相同。增加if语法,列表中只会保留下满足条件的元素,类似于filter函数。
lists = [str(x)+str(y) for x in range(10) for y in range(10) if x != y]
print(lists)
字典生成式
前面说完了列表生成式的一些样例,其实字典也可以推导,不过由于字典还有key和value,所以形式了列表有一点不同。
简单形式
#定义两个列表
ls1 = ["a", "b", "c", "d"]
ls2 = [1, 2, 3, 4]
#生成第三个字典
new_map = {x:y for x,y in zip(ls1, ls2)}
print(new_map)
#输出为{'a': 1, 'b': 2, 'c': 3, 'd': 4}
在字典生成式中循环嵌套应该是没有什么意义的,因为字典要求key唯一。
带if判断
#定义两个列表
ls1 = ["a", "b"]
ls2 = [1, 2]
#生成第三个字典
new_map = {x:y for x,y in zip(ls1, ls2) if x > 1}
print(new_map)
#输出为{'b': 2}
#定义两个列表
ls1 = ["a", "b", "c"]
ls2 = [70, 80, 40]
#生成第三个字典
new_map = {x: score if score > 60 else 61 for x, score in zip(ls1, ls2)}
print(new_map)
#输出为{'a': 70, 'b': 80, 'c': 61}