鱼C论坛

 找回密码
 立即注册
查看: 1359|回复: 5

[已解决]列表的推导式

[复制链接]
发表于 2020-7-1 20:36:24 | 显示全部楼层 |阅读模式

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

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

x
代码1:
>>> list1 = ['1.just do it','2.=一切皆有可能','3.让编程改变世界','4.impossible is nothing']
>>> list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
>>> list3 =[name + slogan[2:] for name in list2 for slogan in list1 if name[0] == slogan[0]]
>>> for each in list3:
        print(each)

        
4.阿迪达斯impossible is nothing
2.李宁=一切皆有可能
3.鱼C工作室让编程改变世界
1.耐克just do it

代码2:
>>> list1 = ['1.just do it','2.一切皆有可能','3.让编程改变世界','4.impossible is nothing']
>>> list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
>>> list3 =[name + slogan[2:] for slogan in list1 for name in list2  if name[0] == slogan[0]]
>>> for each in list3:
        print(each)

        
1.耐克just do it
2.李宁一切皆有可能
3.鱼C工作室让编程改变世界
4.阿迪达斯impossible is nothing

问:代码1和代码2的区别在于list3,最终导致打印结果不一样。为什么list3的代码顺序不一样会产生这样的结果呢?
最佳答案
2020-7-1 20:48:42
可以先试试这段代码
>>> list1 = [1,2,3,4]
>>> list2 = [1,2,3,4]
>>> list3 = [str(a1) + str(a2) for a1 in list1 for a2 in list2]
>>> list3
['11', '12', '13', '14', '21', '22', '23', '24', '31', '32', '33', '34', '41', '42', '43', '44']
相当于是for a1 in list1里套了一个for a2 in list2
这段代码同理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-1 20:48:42 | 显示全部楼层    本楼为最佳答案   
可以先试试这段代码
>>> list1 = [1,2,3,4]
>>> list2 = [1,2,3,4]
>>> list3 = [str(a1) + str(a2) for a1 in list1 for a2 in list2]
>>> list3
['11', '12', '13', '14', '21', '22', '23', '24', '31', '32', '33', '34', '41', '42', '43', '44']
相当于是for a1 in list1里套了一个for a2 in list2
这段代码同理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 20:57:39 | 显示全部楼层
例如代码2里
因为是for list1里套了一个for list2
所以先遍历list1
list1遍历到1.just doit时
要直到list2遍历到  1.耐克  (也就是list2里最后一个元素)时才会打印
后面的代码同理

总之,代码2里就是依次遍历list1,从list2里找匹配的元素打印
                    代码1里就是依次遍历list2,从list1里找匹配的元素打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 20:59:17 | 显示全部楼层
本帖最后由 yhhpf 于 2020-7-1 21:18 编辑

#list3 =[name + slogan[2:] for name in list2 for slogan in list1 if name[0] == slogan[0]]
#你把这个独立出来看,用多行来写就是:
list1 = ['1.just do it','2.=一切皆有可能','3.让编程改变世界','4.impossible is nothing']
list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
#-------------------------------------------------------------

list3 = []
for name in list2:
    for slogan in list1:
        if name[0] == slogan[0]:
            list3.append(name + slogan[2:])
for each in list3:
    print(each)

#list3 =[name + slogan[2:] for slogan in list1 for name in list2  if name[0] == slogan[0]]
#同样这个也独立出来看,用多行来写就是:

list1 = ['1.just do it','2.=一切皆有可能','3.让编程改变世界','4.impossible is nothing']
list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
#-------------------------------------------------------------

list3 = []
for slogan in list1:
    for name in list2:
        if name[0] == slogan[0]:
            list3.append(name + slogan[2:])
for each in list3:
    print(each)

[b]相当于两个循环嵌套使用,比如两个循环,单独执行结果是:
循环name结果是:1A,2B,3C,4D
循环slogan结果是4d,3c,2b,1a

而当嵌套使用时,会先执行外层循环1次,而外层执行1次内层的就会全部执行,即假设先执行name ,slogan在name内;
那外层name执行1次时:结果是1A,4d,3c,2b,1a,外层1次,内层全部执行。
所以当判断语句if name[0] == slogan[0] 执行后,最后所有循环跑完的结果就是[1Aa,2Bb,3Cc,4Dd]

相对的,如果slogan在外层,则:
外层slogan执行1次时:结果是4d,1A,2B,3C,4D,即同样外层slogan执行1次时,内层全部执行;
所以当判断语句if name[0] == slogan[0] 执行后,最后所有循环跑完的结果就是[4Dd,3Cc,2Bb,1Aa]
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-1 21:03:25 | 显示全部楼层
嵌套函数被调用时,先执行外部函数,再执行内部函数  是吗?但是嵌套不是都有个def吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 21:05:51 | 显示全部楼层
本帖最后由 Twilight6 于 2020-7-1 21:19 编辑
生存不易 发表于 2020-7-1 21:03
嵌套函数被调用时,先执行外部函数,再执行内部函数  是吗?但是嵌套不是都有个def吗





这个不是函数哈,应该称为循环,叫做嵌套循环,嵌套循环时,先执行外部循环,然后再执行内部的循环,内部循环执行完毕后,开始下一次的外部循环

这里顺序不同主要是因为 每次 for 循环都要将内部的代码全部执行完,才开始下一次最外部的循环导致的,加上你最外层第一个是循环 list2,第二个是循环 list1,循环的列表不同导致的

这里内部还有一个 for 循环 所以,外部 for 循环过程中,要将内部全部循环完然只有满足 if 的条件就进行拼接

而且一个是先循环  list3 =[name + slogan[2:] for name in list2 for slogan in list1 if name[0] == slogan[0]]

另一个是 :list3 =[name + slogan[2:] for slogan in list1 for name in list2  if name[0] == slogan[0]]

循环过程是按照顺序循环下去的,所以导致第一个代码是循环字符串编号的顺序是 4、2、3、1

>>> list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']

第二个代码循环字符串编号的顺序是 1、2、3、 4

>>> list1 = ['1.just do it','2.=一切皆有可能','3.让编程改变世界','4.impossible is nothing']

所以导致你最后结果顺序的不同



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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 03:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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