0%

列表生成式

列表中,比较少用的是列表生成式,之前用的一直是比较常规的方式,所以列表生成式这种比较简便的方式在这里做个记录,方便以后自己反复查看

1.使用函数range创建数字列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def list1():		# 列表生成式
numbers = []
numbers = list(range(1, 10))
print(numbers)


def list2():
num = []
num = range(10)
for i in num:
print(i, end=" ")


if __name__ == "__main__":
list1()
list2()

1
2
3
输出结果为:
[1, 2, 3, 4, 5, 6, 7, 8, 9] #list1()的输出结果
0 1 2 3 4 5 6 7 8 9 #list2()的输出结果

如果要生成[1x1, 2x2, 3x3, ..., 10x10]这种形式的话,可以用常规的方式:遍历数组中的数,让数组中的数相乘,如下:

1
2
3
4
5
6
7
8
9
def _chen():
L = []
for x in range(1, 11):
L.append(x * x)
print(L)


if __name__ == "__main__":
_chen()
1
2
输出结果为:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

用列表生成式的方法做就是:把要生成的元素(以上面的例子为例:要生成的元素是x * x)放在前面,后面跟for循环,如下:

1
2
3
4
5
6
7
def _chen_list():		# 列表生成式
L = [x * x for x in range(1, 11)]
print(L)


if __name__ == "__main__":
_chen_list()

输出结果和上面的常规方法输出的结果一样:

1
2
输出结果为:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

2.列表生成式 + if

跟在for后面的if是一个筛选条件,不能带else

1
2
3
4
5
6
7
def _chen_list():
L = [x * x for x in range(1, 11) if x % 2 == 0]
print(L)


if __name__ == "__main__":
_chen_list()
1
2
输出结果为:
[4, 16, 36, 64, 100]

相当于:

1
2
3
4
5
6
7
8
9
10
11
def _chen_():
L = []
for x in range(1, 11):
if x % 2 == 0:
x_all = x * x
L.append(x_all)
print(L)


if __name__ == "__main__":
_chen_()

3.列表生成式 + if ….else

if写在for前面必须加else,因为for前面的部分是一个表达式,它必须根据x计算出一个结果

如下这条表达式,x if x % 2 == 0,它无法根据x计算出结果,因为缺少else,必须加上else

1
2
3
4
5
6
7
def _ruguo():
L = [x if x % 2 == 0 else -x for x in range(1, 11)]
print(L)


if __name__ == "__main__":
_ruguo()
1
2
输出结果为:
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]

这个的效果就相当于:

1
2
3
4
5
6
7
8
9
10
11
12
13
def ru_guo():
L = []
for x in range(1, 11):
if x % 2 == 0:
x1 = x
else:
x1 = -x
L.append(x1)
print(L)


if __name__ == "__main__":
ru_guo()

4.两层循环,生成全排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def pai_lie():
L = [m + n for m in 'ABC' for n in 'XYZ']
W = [m + n for m in '123' for n in '456']
print(W)

# pai_lie()函数等价于qing_xi(),但是并不是完全等价,pai_lie这个函数输出来以后是一个列表,如下输出结果4.1所示
#而qing_xi函数输出来的是一个一个单独的,如下图输出结果4.2所示

def qing_xi():
for m in '123':
for n in '456':
print(m + n)


if __name__ == "__main__":
pai_lie()
1
2
输出结果4.1
['14', '15', '16', '24', '25', '26', '34', '35', '36']
1
2
3
4
5
6
7
8
9
10
输出结果4.2
14
15
16
24
25
26
34
35
36

如果想和pai_lie完全一样,还应该定义一个空的列表,将(m+n)放进列表中

1
2
3
4
5
6
7
8
9
10
def qing_xi():
L = []
for m in '123':
for n in '456':
L.append(m+n)
print(L)


if __name__ == "__main__":
qing_xi()

5.例题:

题目:有L1列表如下:L1 = [‘Hello’, ‘World’, 18, ‘Apple’, None],列表中有数字有字符(字符有大写有小写)有空值,现要求输出成[‘hello’, ‘world’, ‘apple’]。用lower 函数将将所有字母都转换成小写,用isinstance函数判断一个变量是不是字符串。编写代码如下:

1
2
3
4
5
6
7
8
9
def _li_ti():
L = [x * x for x in range(1, 11) if x % 2 == 0]
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [x.lower() for x in L1 if isinstance(x, str) is True]
print(L2)


if __name__ == "__main__":
_li_ti()

另一种形式为:

1
2
3
4
5
6
7
8
9
10
11
def is_instance():
L = []
L1 = ['Hello', 'World', 18, 'Apple', None]
for s in L1:
if isinstance(s, str) is True:
L.append(s.lower())
print(L)


if __name__ == "__main__":
is_instance()
点这里请我吃个小蛋糕吧~~

Welcome to my other publishing channels