Python列表推导

这篇具有很好参考价值的文章主要介绍了Python列表推导。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

列表推导式

表达式是元组(例如上例的 (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

到了这里,关于Python列表推导的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js 正则表达式 验证 ip列表--详情:页面中一个输入框,可输入1个或多个IP,使用英文逗号隔开...

    var   isIp =  function   (){        var    regexp = /^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/;                       return    function   (value){            var    valid = regexp.test(value);            if   (!valid){   //首先必须是 xxx.xxx.xxx.xxx 类型的数字,如果不是,返回false   

    2024年02月11日
    浏览(30)
  • 老夫的正则表达式大成了,桀桀桀桀!!!【Python 正则表达式笔记】

    特殊字符 .^$?+*{}[]()| 为特殊字符,若想要使用字面值,必须使用 进行转义 字符类 [] [] 匹配包含在方括号中的任何字符。它也可以指定范围,例: [a-zA-Z0-9] 表示a到z,A到Z,0到9之间的任何一个字符 [u4e00-u9fa5] 匹配 Unicode 中文 [^x00-xff] 匹配双字节字符(包括中文) 在 [] 中

    2024年02月04日
    浏览(45)
  • 机器学习与数据科学-专题1 Python正则表达式-【正则表达式入门-1】

    为了完成本关任务,你需要掌握: 在 Python 中使用正则表达式; 最基础正则表达式; 正则匹配函数。 在 Python 中使用正则表达式 正可谓人生苦短,我用 Python。Python 有个特点就是库非常多,自然拥有正则匹配这种常见的库,并且此库已经嵌入在 Python 标准库中,使用起来非常

    2024年01月22日
    浏览(35)
  • python 正则表达式

    2024年01月17日
    浏览(36)
  • PYthon正则表达式

    正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则

    2024年01月17日
    浏览(34)
  • python之正则表达式

    目录 正则表达式 python正则表达式方法  match search findall finditer compile 元字符匹配 元字符 量词 贪婪匹配和惰性匹配 正则表达式的group 语法 案例  正则表达式又称规则表达式,是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式的文

    2024年02月14日
    浏览(30)
  • Python 正则表达式转义

    这篇文章是关于 Python 正则表达式转义的。 此外,我们将介绍 Python 正则表达式转义以及如何通过适当的示例代码使用它,以及 Python 正则表达式的多种用途。 此外,Python 支持使用正则表达式(或正则表达式)对字符串进行搜索和替换操作。 RegEx 是一种根据预定义模式匹配文

    2024年02月09日
    浏览(28)
  • 速通Python正则表达式

    几乎所有语言中的正则表达式都有相类似的语法,python亦莫能外。 接下来直观地看一下最常用的的三大函数 其中, re.match 要求从头匹配; search 可以从任意位置匹配,但只返回第一个匹配的值的位置; findall 返回所有符合要求的值。 任意字符 . 匹配除了换行符之外的所有字

    2024年02月06日
    浏览(27)
  • Python正则表达式(小结)

    正则表达式(regular expression,有时简写为RegEx 或 regex)就是用一组由字母和符号组成的“表达式”来描述一个特征,然后去验证另一个“字符串”是否符合/匹配这个特征。 (1)验证字符串是否符合指定特征,比如验证邮件地址是否符合特定要求等; (2)用来查找字符串,

    2024年02月05日
    浏览(26)
  • Python---正则表达式与递归

    1.  正则表达式: 是一种字符串验证的规则,通过特殊的字符串组合来确立规则 用规则去匹配字符串是否满足 如 (^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$) 可以表示为一个标准邮箱的格式 re 模块的三个主要方法: re.match: re.match( 匹配规则, 被匹配字符串 ) 从被匹配字符串开头进行匹

    2024年02月02日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包