鱼C论坛

 找回密码
 立即注册
查看: 2630|回复: 1

[学习笔记] [python表达式之列表推导式]

[复制链接]
发表于 2018-11-23 18:15:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 heidern0612 于 2018-11-23 18:20 编辑

以下文字部分摘自网络,只为个人学习所用,不做任何商业用途,讲的比较浅,有错误希望鱼油给予指正。


每次看大牛的代码很奇怪,比如T=[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]

这是什么鬼,一个变量T为什么搞得这么拥挤,看着也累啊,后来查了一下才知道这个叫推导式。

推导式是可以从一个数据序列构建另一个新的数据序列的结构体。


【列表推导式】

列表推导能非常简洁的构造一个新列表,只用一条简洁的表达式即可对得到的元素进行转换变形。

其基本格式如下:

代码如下:[expr  for value in collection  if  condition]

过滤条件可有可无,取决于实际应用,只留下表达式;

相当于下面这段for循环:
result = []
for value in collection:                           #for循环
if condition:                                        #if条件
result.append(expression)                        #最后append的值在推导式里第一个出现。

借助列表推导式,我们可以使用 for 循环用一步创建一个列表。



列表推导式中的条件语句:

可以向列表推导式添加条件语句:squares = [x**2 for x in range(9) if x % 2 == 0]

如果你要添加 else,则需要将条件语句移到列表推导式的开头,直接放在表达式后面, 如下:

squares = [x**2 if x % 2 == 0 else x + 3 for x in range(9)]

注意:列表推导式并没有在其他语言中出现,但是在 python 中很常见。



列表推导式总共有两种形式:

①[x for x in data if condition]

此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表。


②[exp1 if condition else exp2 for x in data]

此处if...else主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个数据列表。


例:
numLists  = []
def test():
    for i in xrange(147):
        numList = []
        for j in xrange(147):
            if i == j:
                numList.append(1)
            else:
                numList.append(0)
        numLists.append(numList)
test()

在这个例子中,总共的行数是11行, 那么如果用列表推导式应该怎么写呢?

[[1 if i == j else 0 for i in range(147)] for j in range(147)]   (两部分)


列表推导式生成的结果跟 test 函数生成的结果是一模一样的,但是行数却要少得多。

同时在进行性能测试时发现, 列表推导式的运行时间只有 test 函数的一半,因此无论是为了减少代码行数还是提高性能, 都应该使用列表推导式

当然了, 列表推导式不是只有这样的应用, 它还可以用来生成一个元素符合你想要的列表, 好处在于除了不用特地写个函数或者写个for循环之外, 还在于它的简单而又实用,是优秀的程序员必备的技能之一。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-15 04:15:55 | 显示全部楼层
看来还有很多东西要学习啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 08:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表