python三元表达式、列表生成式
目录
一、简介
列表生成式是python内置的非常强大的创建列表的方式,基本的列表生成式包括至少一个for
语句,0个或者多个if
语句,并且支持嵌套。
二、详解
列表生成式一般有三种基本形式
1、三元表达式
语法:expression(1) if condition else expression(2)
参数:当条件condition满足时执行experssion(1),当条件不满足时执行expression(2)
2、不需要条件判断
语法:[expression(x) x for x in data]
参数:expression
表示对x进行的操作,data
是一个iterable可迭代的对象。
3、只需要正向的条件判断
语法:[expression(x) for x in data if condition]
参数:expression
表示对x进行的操作,data
是一个iterable可迭代的对象,condition
表示需要满足的条件。
4、同时需要正向反向的条件判断
语法:[expression1(x) if condintion else expression2(x) for x in data]
这其实是一个列表生成器然后套用了一个三元表达式
参数:expresion1
和expression2
表示对x进行的操作,data
是一个iterable可迭代的对象,condition
表示判断的条件
5、列表推导式for循环的嵌套
语法:[expression(x) for xs in data for x in xs if condition]
参数:expression
表示对x进行的操作,data
是一个iterable可迭代的对象,condition
表示需要满足的条件
嵌套可以简单理解为从上到下,嵌套中for循环中各个for的顺序是怎样的,嵌套推导式中各个for表达式的顺序就是怎样的。
三、代码
1、三元表达式
b = 1
a = 0 if b % 2 == 0 else 1
print(a)
1
2、不需要条件判断的例子
对0~19之间的数都减5
lst = [i - 5 for i in range(20)]
print(lst)
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
3、需要正向条件判断的例子
例如我们需要删除上一个例子中获得列表中的负数元素
lst = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
new_lst = [i for i in lst if i >=0]
print(new_lst)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
4、需要正向与反向条件判断的例子
2中的例子,会使列表长度变短,但是有时候我们不希望改变列表的长度,我们可以用任意数字去填充负数的位置,这里用的是None
lst = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
new_lst = [i if i >= 0 else None for i in lst]
print(new_lst)
[None, None, None, None, None, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
5、for嵌套的例子
4.1
例如我需要将一个string拆分成一个字典,下面这个string表示人名所对应的年龄
string = "Alex:23|Jack:22|Eric:24"
name_dict = {key: int(value) for item in string.split('|') for key, value in (item.split(':'), )}
print(name_dict)
{'Alex': 23, 'Jack': 22, 'Eric': 24}
这一段代码可以帮助读者理解其中具体发生了什么
print({item for item in string.split('|')})
print({key:value for item in string.split('|') for key, value in (item.split(':'), )})
{'Alex:23', 'Jack:22', 'Eric:24'}
{'Alex': '23', 'Jack': '22', 'Eric': '24'}
4.2
这个例子是从男女生的名字中寻找含有两个或者两个以上字母e的名字。
all_data = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Susie', 'Casey', 'Jill', 'Ana', 'Eva', 'Jennifer', 'Stephanie']]
result = [name for names in all_data for name in names if name.count('e') >= 2]
print(result)
['Jefferson', 'Wesley', 'Steven', 'Jennifer', 'Stephanie']
4.3
下面这个例子是将数据扁平化flatten
# flatten扁平化
some_tuples = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
flatten_tup = tuple(tup for tups in some_tuples for tup in tups)
flatten_tup, type(flatten_tup)
((1, 2, 3, 4, 5, 6, 7, 8, 9), tuple)