鱼C论坛

 找回密码
 立即注册
查看: 918|回复: 6

嵌套列表推导式的还原问题

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

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

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

x
m1= [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],]
#目的是将3*4的矩阵转换为4*3的矩阵
m2=[]
#设定一个空列表
for i in range(4):
    #第一个for循环,目的为第二个for循环创建索引值
    temp=[]
    m2.append(temp)
    
    #将完成第二个for循环的m1中每个元素的第i个元素的集合temp添加到m2末尾
    for row in m1:
        #第二个for循环,目的为遍历m1的元素并根据第一个for循环给的索引值
        temp.append(row[i])
        #将m1中所有元素的第i个元素添加到temp中

print(m2)

m3=[[row[i] for row in m1] for i in range(4)]
print(m3)

输出结果如下
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
>>> 

       这是我在还原列表推导式时遇到的问题,求大佬们解答

问题1:在执行第一个for循环时,为何m2没有将temp添加到m2中?即为什么m2第0个元素不是空列表?

            如果在for循环外部添加temp=[],并且将第一个for循环中  temp=[]   和  m2.append(temp)  的顺序调反的话,则m2第0个元素会为空列表,这是为什么?

问题2:嵌套的列表推导式是否是按照从左到右,从外层到内层的方式嵌套的?

           如果有括号的话,比如m3的  [row[i] for row in m1]  这种列表的中括号是否可以理解为平常的小括号?即有‘括号’的为内层,外层继续按照从左到右的的方式嵌套?

           或者此处的  [row[i] for row in m1]  是否可以理解为 list( row[i] for row in m1) 即优先运算函数的为内层?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-6 17:00:33 | 显示全部楼层
temp是空列表,但是你在后边append了
都是从外到内吧,一般是从右到左,左侧是序列元素组成
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-6 18:38:38 | 显示全部楼层
塔利班 发表于 2018-11-6 17:00
temp是空列表,但是你在后边append了
都是从外到内吧,一般是从右到左,左侧是序列元素组成

感谢大佬回答

就算temp是空列表,应该也是能够append添加进去的吧,我自己试了下空列表append空列表输出会是个[[]],另外我把temp=[]和m2.append(temp)顺序反过来的话,输出结果会变成 [[],[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]  ,即第0个元素为空列表。

假如说嵌套了多个for语句,是不是左侧的for为外层,右侧的for为内层?

那个 [row[i] for row in m1]  没有外面这个中括号的话,输出结果就变成了[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]   ,与原结果完全不同了,如果不使用这种方式还有其他的写法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-6 18:55:34 | 显示全部楼层
左侧是外层,我说的是先看循环再看取出元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-6 19:02:46 | 显示全部楼层
塔利班 发表于 2018-11-6 18:55
左侧是外层,我说的是先看循环再看取出元素

第2个问题明白了,谢谢大佬

但第1个问题还是不太明白,为什么这个顺序里m2不会添加空列表,换个顺序就会添加空列表了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-6 19:20:54 | 显示全部楼层
你颠倒temp没定义,怎么append
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-6 19:34:03 | 显示全部楼层
塔利班 发表于 2018-11-6 19:20
你颠倒temp没定义,怎么append

我原代码是先定义temp为空列表再进行append的,但输出结果第0个元素不是空列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 13:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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