鱼C论坛

 找回密码
 立即注册
查看: 1843|回复: 3

[已解决]有大佬能讲讲这个吗?

[复制链接]
发表于 2021-2-18 10:55:29 | 显示全部楼层 |阅读模式

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

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

x
[x for x in range(1,100)if x%3==0]
我知道这是个列表推导式,但是大佬能讲讲列表推导式的具体格式吗?
最佳答案
2021-2-21 09:12:40
我在研究列表解析式的时候,我领悟到一个道理就是,代码的简洁和可读性有时候背道而驰的。在讲那个三元表达式的时候就是这样了。
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]


for row in matrix:
    for col in row:
        print(col)

ff = [i for a in matrix for i in a]
复制代码


这循环看的很清楚啊,这样复杂的列表解析就是很难看的(至少目前是这样的)

不过很重的是,要理解列表解析式,很明显多看看循环就知道了。

所以,总结一下列表解析法的要点:
1.结合循环,循环一定是其基础!!就像  a = b if 条件 else c 一样,必须理解其本身的样子
2.是为了从可迭代对象建立序列的时候才用这样的方法,更为简单
3.也有条件表达的 如
evens = [i for i in range(10) if i % 2 == 0]
复制代码

4.切记可以不用太复杂了,两层我觉得就够了
关键词:可迭代,创建序列,循环
参考文献:https://www.cnblogs.com/amiza/p/10159293.html

紧急补充:元组不可以!!目前看来是只有可改变的序列才可以:集合,字典,列表

ps;看吧,掌握了循环就很快就知道怎么看这个列表解析了
list2 = []
for x in range(10):
    for y in range(10):
        if x %2 == 0:
            if y %2 != 0:
                list2.append((x,y))
print(list2)

list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-18 11:16:41 | 显示全部楼层
[x for x in range(1,100)if x%3==0]
相当于
lst = []
for x in range(1,100):
    if x % 3 == 0:
        lst.append(x)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-18 11:32:07 | 显示全部楼层
[x for x in range(1,100)if x%3==0]
大白话 列表中存储着变量x, x是由 range(1,100)迭代产生的,条件为 x%3==0
格式就是 [变量名 for 变量 in 迭代器 if 条件]
其中if 条件可以去掉
最简单的推导
>>> [i for i in range(3)]
[0, 1, 2]

加上条件
>>> [i for i in range(3) if i]
[1, 2]

混合推导
>>> [[x,y] for x in range(3) for y in range(3)]
[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-21 09:12:40 | 显示全部楼层    本楼为最佳答案   
我在研究列表解析式的时候,我领悟到一个道理就是,代码的简洁和可读性有时候背道而驰的。在讲那个三元表达式的时候就是这样了。
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]


for row in matrix:
    for col in row:
        print(col)

ff = [i for a in matrix for i in a]
复制代码


这循环看的很清楚啊,这样复杂的列表解析就是很难看的(至少目前是这样的)

不过很重的是,要理解列表解析式,很明显多看看循环就知道了。

所以,总结一下列表解析法的要点:
1.结合循环,循环一定是其基础!!就像  a = b if 条件 else c 一样,必须理解其本身的样子
2.是为了从可迭代对象建立序列的时候才用这样的方法,更为简单
3.也有条件表达的 如
evens = [i for i in range(10) if i % 2 == 0]
复制代码

4.切记可以不用太复杂了,两层我觉得就够了
关键词:可迭代,创建序列,循环
参考文献:https://www.cnblogs.com/amiza/p/10159293.html

紧急补充:元组不可以!!目前看来是只有可改变的序列才可以:集合,字典,列表

ps;看吧,掌握了循环就很快就知道怎么看这个列表解析了
list2 = []
for x in range(10):
    for y in range(10):
        if x %2 == 0:
            if y %2 != 0:
                list2.append((x,y))
print(list2)

list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 11:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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