鱼C论坛

 找回密码
 立即注册
查看: 2375|回复: 9

[已解决]第十一课的动手习题

[复制链接]
发表于 2020-1-1 23:12:28 | 显示全部楼层 |阅读模式

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

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

x
有两个问题请教。。。
第一个问题,程序理解:
list1 = ['1.Jost do It','2.一切皆有可能','3.让变成改变世界','4.Impossible is nothing']
list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
list3 = [name + ':' + temp[2:] for temp in list1 for name in list2 if temp[0] == name[0]]
print(list3)
for each in list3:
    print(each)
蓝字部分不是很理解,为什么name不需要加[]而temp需要加[]
后面if temp[0] == name[0],为什么会自动调整顺序,有点懵了

第二个问题:
我自己写了个推导式总是在蓝字部分报错,找不到原因了,
list1 = ['1.Jost do It','2.一切皆有可能','3.让变成改变世界','4.Impossible is nothing']
list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
list3 = []
for temp in list1:
    for name in list2:
        if temp[0] == name[0]:
            list3.append(name + ':' + temp[2:])
                print(list3)
for each in list3:
    print(each,end='')

请大佬赐教,就这个题目弄了一个多小时没明白
最佳答案
2020-1-2 00:34:56
1.(1)不用打[]的原因在于你想要输出什么样的结果,你加中括号也是没错的,按上面的代码你会输出比如说(1.耐克:just do it)因为你不想输出的结果是:(1.耐克:1.just do it)所以将后面的字符串切片了,前面的1.就去掉,因此就是name不要加,temp要加
   (2)temp和name都是字符串,代码的判断条件就是判断字符串前面那个数字是不是一样的,如果是一样的就会被放入到列表3中,不是一样的就会被过滤,所以输出的结果你看起来就是在排序。此外,如果你说的排序是指1.2,3,4这种升序排列的话,主要原因在于在列表3中你是先循环了列表1,所以排序就会是1—-、2——-、3—-、4—-。如果你先循环列表2.输出的结果就会是4—-、3—-等(降序排列)

2.你的代码中print()的缩进有问题(参考楼上大佬们回答)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-1 23:19:33 | 显示全部楼层
懵不懵主要看你用不用心。好好看看改变后的代码吧

list1 = ['1.Jost do It','2.一切皆有可能','3.让变成改变世界','4.Impossible is nothing']
list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
list3 = []
for temp in list1:
    for name in list2:
        if temp[0] == name[0]:
            list3.append(name + ':' + temp[2:])


            
print(list3)
for each in list3:
    print(each)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-1 23:30:15 | 显示全部楼层
      1、因为外层循环对象是 list1 ,list1 中字符串的首字符是按 '1'、'2'、'3'、'4' 的顺序排列的,而 list3 中新元素的数字序号继承自 list1,所以,其数字序号自然与 list1 保持一致;
  
      2、 你的代码显然存在缩进问题:
        if temp[0] == name[0]:
            list3.append(name + ':' + temp[2:])
                print(list3)                                   # 此句与上一句不应该有缩进关系
            这么改就不会有问题了:
        if temp[0] == name[0]:
            list3.append(name + ':' + temp[2:])
            print(list3)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 00:34:56 | 显示全部楼层    本楼为最佳答案   
1.(1)不用打[]的原因在于你想要输出什么样的结果,你加中括号也是没错的,按上面的代码你会输出比如说(1.耐克:just do it)因为你不想输出的结果是:(1.耐克:1.just do it)所以将后面的字符串切片了,前面的1.就去掉,因此就是name不要加,temp要加
   (2)temp和name都是字符串,代码的判断条件就是判断字符串前面那个数字是不是一样的,如果是一样的就会被放入到列表3中,不是一样的就会被过滤,所以输出的结果你看起来就是在排序。此外,如果你说的排序是指1.2,3,4这种升序排列的话,主要原因在于在列表3中你是先循环了列表1,所以排序就会是1—-、2——-、3—-、4—-。如果你先循环列表2.输出的结果就会是4—-、3—-等(降序排列)

2.你的代码中print()的缩进有问题(参考楼上大佬们回答)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 00:44:11 | 显示全部楼层
补充一下,那个升序与降序是你人为控制的。因为你自己在创建列表1与列表2的时候,对于每一个元素你自己就排了一个序,所以结果就会出现排序这么一说,如果你给定的元素前面没有序号或者随意给数字,那输出的结果就看起来就是乱序了(当然你最终的判断条件就需要跟着变)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-2 16:42:19 | 显示全部楼层
本帖最后由 Peteryo01223 于 2020-1-2 16:56 编辑

第一个问题:为什么name不需要加[]而temp需要加[] (因为:name的全部字符都需要,而temp中我们仅仅需要序号和 . 之后的所有字符,所以用[2:]合理,表示“只需要从第三个字符开始显示”)
后面if temp[0] == name[0],为什么会自动调整顺序,有点懵了(因为:for temp in list1 for name in list2 这里看temp和name谁在前。temp在前,就按照temp目前的顺序1.2.3.4开始比对。如果,你换成for name in list2 for temp in list1,就按照name的顺序比对,你会发现排列就是4.2.3.1了,对不?

第二个问题:代码存在缩进问题,请参考以上各位的解释。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 20:24:21 | 显示全部楼层
jackz007 发表于 2020-1-1 23:30
1、因为外层循环对象是 list1 ,list1 中字符串的首字符是按 '1'、'2'、'3'、'4' 的顺序排列的,而 l ...

多谢解惑,我犯了个低级错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 20:26:21 | 显示全部楼层
ba21 发表于 2020-1-1 23:19
懵不懵主要看你用不用心。好好看看改变后的代码吧

多谢解惑,我知道自己犯了两个错误,第一个是缩进不正确,print不应该在list3.append下一行缩进;第二个是print(list3)应与首个for循环一致,否则每循环一次就会输出一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 20:45:13 | 显示全部楼层
百分号 发表于 2020-1-2 00:34
1.(1)不用打[]的原因在于你想要输出什么样的结果,你加中括号也是没错的,按上面的代码你会输出比如说(1 ...

多谢解惑,首先附正确答案:
list1 = ['1.Jost do It','2.一切皆有可能','3.让变成改变世界','4.Impossible is nothing']
list2 = ['4.阿迪达斯','2.李宁','3.鱼C工作室','1.耐克']
list3 = []
for temp in list1:
    for name in list2:
        if temp[0] == name[0]:
            list3.append(name + ':' + temp[2:])
#            print(list3)
print(list3)
for each in list3:
    print(each)

关于if temp[0] == name[0]:这行代码我明白什么意思了,因为temp是属于list1列表,name属于list2列表,所以name【0】实际是list1中每一个列表的第一个元素,例如name = ('1.耐克'),那么name[0]实际就是1,同样如你所说,temp[2:]就是我讲temp进行了切片,因为我不想再输入一个<1.>,所以我将字符串temp = ('1.Jost do It')从第二个元素开始进行了切片,只取<Jost do It>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 20:46:12 | 显示全部楼层
Peteryo01223 发表于 2020-1-2 16:42
第一个问题:为什么name不需要加[]而temp需要加[] (因为:name的全部字符都需要,而temp中我们仅仅需要序 ...

多谢解惑,我明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 15:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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