目录
列表推导式
表达式是元组(例如上例的 (x, y))时,必须加上括号:
列表推导式可以使用复杂的表达式和嵌套函数:
嵌套的列表推导式
实际应用中,最好用内置函数替代复杂的流程语句。此时,zip() 函数更好用:
使用Python列表推到创建数据pytest驱动数据
列表推导式
列表推导式创建列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。
例如,创建平方值的列表:
squares = []
for x in range(10):
squares.append(x**2)
print(squares)
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意,这段代码创建(或覆盖)变量 x
,该变量在循环结束后仍然存在。下述方法可以无副作用地计算平方列表:
squares = list(map(lambda x: x**2, range(10)))
或等价于:
squares = [x**2 for x in range(10)]
上面这种写法更简洁、易读。
列表推导式的方括号内包含以下内容:一个表达式,后面为一个 for
子句,然后,是零个或多个 for
或 if
子句。结果是由表达式依据 for
和 if
子句求值计算而得出一个新列表。 举例来说,以下列表推导式将两个列表中不相等的元素组合起来
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
输出:[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
等价于:
combs = []
for x in [1,2,3]:
for y in [3,1,4]:
if x != y:
combs.append((x, y))
>>>combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
注意,上面两段代码中,for 和 if 的顺序相同。
表达式是元组(例如上例的 (x, y))时,必须加上括号:
>>>vec = [-4, -2, 0, 2, 4]
# 用一个值的2倍创建一个新列表
>>>[x*2 for x in vec]
[-8, -4, 0, 4, 8]
# 排除负数创建列表
>>>[x for x in vec if x >= 0]
[0, 2, 4]
# 对所有元素使用绝对值函数
>>>[abs(x) for x in vec]
[4, 2, 0, 2, 4]
# 每个元素都调用方法
>>>freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>>[weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
# 创建一个有2个元素的元组的列表,如: (number, square)
>>>[(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
# 元组必须用括号括起来不然会报错
>>>[x, x**2 for x in range(6)]
File "<stdin>", line 1
[x, x**2 for x in range(6)]
^^^^^^^
SyntaxError: did you forget parentheses around the comprehension target?
# 使用带有两个“for”展开列表组
>>>vec = [[1,2,3], [4,5,6], [7,8,9]]
>>>[num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
列表推导式可以使用复杂的表达式和嵌套函数:
from math import pi
a=[str(round(pi, i)) for i in range(1, 6)]
print(a)
>>>
['3.1', '3.14', '3.142', '3.1416', '3.14159']
嵌套的列表推导式
列表推导式中的初始表达式可以是任何表达式,甚至可以是另一个列表推导式。
下面这个 3x4 矩阵,由 3 个长度为 4 的列表组成
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
下面的列表推导式可以转置行列:
[[row[i] for row in matrix] for i in range(4)]
>>>
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
正如我们在上一节中所看到的,内部列表理解是在其后面的for的上下文中评估的,因此此示例等效于:
transposed = []
for i in range(4):
transposed.append([row[i] for row in matrix])
>>>transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
反过来说,也等价于:
transposed = []
for i in range(4):
# the following 3 lines implement the nested listcomp
transposed_row = []
for row in matrix:
transposed_row.append(row[i])
transposed.append(transposed_row)
实际应用中,最好用内置函数替代复杂的流程语句。此时,zip() 函数更好用:
list(zip(*matrix))
>>>
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
使用Python列表推到创建数据pytest驱动数据
背景:
最近在做一个BI平台的自动化测试,需要根据不同的数据源来添加动态参数。数据源有:MySQL、starrocks、clickhouse、oracle、Doris、Excel...
动态参数类型有:日期、文本、数值...一个数据源要对应多个动态参数如果有M个数据源N个动参则要创建M*N个数据才能覆盖测试,因为是使用pytest来做数据驱动测试,所以如果是手写的话,如果是6个数据源3个动参则要写18行测试数据,如果后续新增数据源和动参还得增加,所以想有没有比较取巧的方法,然后想到python有列表推导可以实现动态创建列表数据。
实现代码如下:
import string
ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
print(ran_str)
mysql = 'test_MySQL_' + ran_str
starrocks = 'test_starrocks_' + ran_str
clickhouse = 'test_clickhouse_' + ran_str
oracle = 'test_oracle_' + ran_str
datasource = [mysql, starrocks, clickhouse, oracle]
parameter = [('日期',), ('文本', ran_str), ('数值', 1000)]
test_data = [(k, v) for k in datasource for v in parameter]
print(test_data)
输出:
[('test_MySQL_VrGSQXC9', ('日期',)), ('test_MySQL_VrGSQXC9', ('文本', 'VrGSQXC9')), ('test_MySQL_VrGSQXC9', ('数值', 1000)), ('test_starrocks_VrGSQXC9', ('日期',)), ('test_starrocks_VrGSQXC9', ('文本', 'VrGSQXC9')), ('test_starrocks_VrGSQXC9', ('数值', 1000)), ('test_clickhouse_VrGSQXC9', ('日期',)), ('test_clickhouse_VrGSQXC9', ('文本', 'VrGSQXC9')), ('test_clickhouse_VrGSQXC9', ('数值', 1000)), ('test_oracle_VrGSQXC9', ('日期',)), ('test_oracle_VrGSQXC9', ('文本', 'VrGSQXC9')), ('test_oracle_VrGSQXC9', ('数值', 1000))]
文章来源:https://www.toymoban.com/news/detail-467436.html
这样就不用写这些重复的数据了~文章来源地址https://www.toymoban.com/news/detail-467436.html
到了这里,关于Python列表推导的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!