鱼C论坛

 找回密码
 立即注册
查看: 4337|回复: 18

[已解决]鱼C教学python012讲习题不太懂,哪位指导下?

[复制链接]
发表于 2018-12-22 17:22:40 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 collick 于 2018-12-24 15:04 编辑
  1. print('-------by xiaojiayu-------')
  2. list20 = ['1.Just do it', '2.一切皆有可能', '3.让编程改变世界', '4.Impossible is Nothing']
  3. list21 = ['4.阿迪达斯', '2.李宁',  '3.鱼C工作室', '1.耐克']
  4. list22 = [name + ':' + slogan[2:] for slogan in list20 for name in list21 if slogan[0] == name[0]]
  5. for each in list22:
  6.     print(each)
复制代码

  1. -------by xiaojiayu-------
  2. 1.耐克:Just do it
  3. 2.李宁:一切皆有可能
  4. 3.鱼C工作室:让编程改变世界
  5. 4.阿迪达斯:Impossible is Nothing
复制代码


代码是如何去掉列表list20中的 "1. 2. 3. 4. "的?
看了半天没搞明白!

  1. +++++++++++++++++感谢各位的帮助!++++++++++++++++++++++++++
  2. 感谢各位的回复,以及在搜索引擎的搜索,个人如下理解(再次感谢heidern0612):
  3. 条件翻译及解析:
  4. list20 = ['1.Just do it', '2.一切皆有可能', '3.让编程改变世界', '4.Impossible is Nothing']
  5. list21 = ['4.阿迪达斯', '2.李宁',  '3.鱼C工作室', '1.耐克']
  6. for slogan in list20:
  7.     for name in list21:
  8.         if slogan[0] == name[0]:
  9.             print(name + ':' + slogan[2:])
  10. 这里需要注意slogan[0] name[0] slogan[2:] :
  11. slogan[0]是遍历list20列表中的元素,这个元素再次变成了一个新的列表,然后取slogan这个列表中的第一个元素与name[0]这个新列表中的第一个元素进行比对;
  12. name[0]是遍历list21列表中的元素,这个元素再次变成了一个新的列表,然后取name这个列表中的第一个元素与slogan[0]这个新列表中的第一元素进行比对;
  13. slogan[2:]是遍历list20列表中的元素,然后对新的列表进行切片取([0,1,2,3,....])2(包含)之后的所有元素

  14. 我这样解释是否正确?
  15. """)
复制代码
最佳答案
2018-12-23 09:43:23
本帖最后由 heidern0612 于 2018-12-23 09:46 编辑

要看懂这个首先你要明白list22中的列表引导式表达的意义。

list22 = [name + ':' + slogan[2:] for slogan in list20 for name in list21 if slogan[0] == name[0]]


首先看 for slogan in list20 for name in list21两句,


这两个句比较简单,就是个二维的列表遍历,遍历了两个列表中的每一个元素。

(二维的的列表遍历可以想象下班级座位,每一行每一排,也可以参考佳宇老师那个摸三色球的问题。)

下面一句if slogan[0] == name[0]的话,(也就是两个列表中每个元素的第0个索引值结果相等的话(每个元素中开头的"0"、“1”“2”之类的)),

if这个作用其实就是判断两个列表中每个元素中开头字符是否相等。

name + ':' + slogan[2:]append进list22列表。(name这里指的是list21中的每个元素,slogan这里指的是list20中的每个元素)

slogan[2:]指的是slogan去掉前面两个元素之后的所有内容。例如"1.Just do it'",去掉头两个元素结果就是“Just do it ”.



上面理解了之后,下面for循环打印list22中的每个元素就比较好理解了。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
windsnow + 3 + 3 + 3 谢谢你的讲解ღ( ′・&#7.

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-12-22 17:30:03 | 显示全部楼层
本帖最后由 大黑狼 于 2018-12-22 17:41 编辑

第四行代码的slogan[2:]利用了类似于列表分片操作,直接从第三个字符读取,比如读取 “4.阿迪达斯” 的时候,因为slogan[2:0]是从索引值为2的位置开始读取,而索引值是从0开始,这样就跳过了"4."这两个字符,直接打印阿迪达斯,数字4和小数点.分别占一个字符,所以后面输入的时候,就不会出现类似于4.阿迪达斯:4.Impossible is Nothing的操作了  大概就是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-12-23 01:22:23 | 显示全部楼层
  1. list1 = ['1.Jost do It','2.一切皆有可能','3.让编程改变世界','4.Impossible is Nothing']
  2. list2 = ['4.阿迪达斯','2.李宁','3.鱼c工作室','1.耐克']
  3. list3 = [name + ':' + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]   
  4. #       [                   表达式          for 变量   in 列表for 变量   in 列表 if  条件                        ]
  5. #新的列表“格式是这样的”  [name + ':' + slogan[2:]  这个“格式”里面的变量从哪里来的呢?有仔细看我的笔记应该可以看到的
  6. #首先看name的值 是从list2列表历遍出来的,是list2列表里面每个的值。同理slogan[2:]等于list1里面每个的值。 [b][size=4]自己注意切片位置[/size][/b]
  7. [b]#假如没有后面if条件,你自己思考下,得出来的list3会是什么? 而后面if条件筛选出来的又是什么条件的字符串,多多思考下。[/b]
  8. list1=["羊","狗","牛"]
  9. list2=['草','狗粮','菜']
  10. [x+'吃'+y for x in list1 for y in list2]
  11. ['羊吃草', '羊吃狗粮', '羊吃菜', '狗吃草', '狗吃狗粮', '狗吃菜', '牛吃草', '牛吃狗粮', '牛吃菜']
  12. #对比下这里,x+'吃'+y  这里是所谓新列表的“格式”,里面 x和y的值是怎么来的?
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-23 09:43:23 | 显示全部楼层    本楼为最佳答案   
本帖最后由 heidern0612 于 2018-12-23 09:46 编辑

要看懂这个首先你要明白list22中的列表引导式表达的意义。

list22 = [name + ':' + slogan[2:] for slogan in list20 for name in list21 if slogan[0] == name[0]]


首先看 for slogan in list20 for name in list21两句,


这两个句比较简单,就是个二维的列表遍历,遍历了两个列表中的每一个元素。

(二维的的列表遍历可以想象下班级座位,每一行每一排,也可以参考佳宇老师那个摸三色球的问题。)

下面一句if slogan[0] == name[0]的话,(也就是两个列表中每个元素的第0个索引值结果相等的话(每个元素中开头的"0"、“1”“2”之类的)),

if这个作用其实就是判断两个列表中每个元素中开头字符是否相等。

name + ':' + slogan[2:]append进list22列表。(name这里指的是list21中的每个元素,slogan这里指的是list20中的每个元素)

slogan[2:]指的是slogan去掉前面两个元素之后的所有内容。例如"1.Just do it'",去掉头两个元素结果就是“Just do it ”.



上面理解了之后,下面for循环打印list22中的每个元素就比较好理解了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2018-12-24 14:33:12 | 显示全部楼层
大黑狼 发表于 2018-12-22 17:30
第四行代码的slogan[2:]利用了类似于列表分片操作,直接从第三个字符读取,比如读取 “4.阿迪达斯” 的时候 ...

感谢您的帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-24 14:34:32 | 显示全部楼层

感谢你的帮助!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-24 15:02:53 | 显示全部楼层
heidern0612 发表于 2018-12-23 09:43
要看懂这个首先你要明白list22中的列表引导式表达的意义。

list22 = [name + ':' + slogan[2:] for slog ...
  1. +++++++++++++++++感谢各位的帮助!++++++++++++++++++++++++++
  2. 感谢各位的回复,以及在搜索引擎的搜索,个人认为如下理解(再次感谢heidern0612):
  3. 条件翻译及解析:
  4. list20 = ['1.Just do it', '2.一切皆有可能', '3.让编程改变世界', '4.Impossible is Nothing']
  5. list21 = ['4.阿迪达斯', '2.李宁',  '3.鱼C工作室', '1.耐克']
  6. for slogan in list20:
  7.     for name in list21:
  8.         if slogan[0] == name[0]:
  9.             print(name + ':' + slogan[2:])
  10. """)
复制代码


这里需要注意slogan[0] name[0] slogan[2:] :
slogan[0]是遍历list20列表中的元素,这个元素再次变成了一个新的列表,然后取slogan这个列表中的第一个元素与name[0]这个新列表中的第一个元素进行比对;
name[0]是遍历list21列表中的元素,这个元素再次变成了一个新的列表,然后取name这个列表中的第一个元素与slogan[0]这个新列表中的第一元素进行比对;
slogan[2:]是遍历list20列表中的元素,然后对新的列表进行切片取([0,1,2,3,....])2(包含)之后的所有元素
我这样解释是否正确?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-12-24 15:14:11 | 显示全部楼层
collick 发表于 2018-12-24 15:02
这里需要注意slogan[0] name[0] slogan[2:] :
slogan[0]是遍历list20列表中的元素,这个元素再次变 ...


上面的列表推导式,比较准确的是下面这段代码:
  1. list20 = ['1.Just do it', '2.一切皆有可能', '3.让编程改变世界', '4.Impossible is Nothing']
  2. list21 = ['4.阿迪达斯', '2.李宁',  '3.鱼C工作室', '1.耐克']
  3. list22=[]
  4. for slogan in list20:
  5.     for name in list21:
  6.         if slogan[0] == name[0]:
  7.             list22.append(name + ':' + slogan[2:])
  8. """)
复制代码


理解稍微有点偏差:

slogan是遍历list20列表中的每个元素,而不是slogan[0],name同理。

slogan[0]指的是list20中单个元素的第0个元素,好像有点绕。

举个栗子:

当slogan第一次遍历list20的时候,slogan的值为“1.Just do it”,所以这个时候slogan[0]的值为“1”;

当slogan第二次遍历list20的时候,slogan的值为“2.一切皆有可能”,这个时候slogan[0]的值为“2”;

name列表也同理,所以最后那个if比较其实两个列表单个元素开头的第一个元素“1”、“2”、“3”、“4”这四个数。

然后去name的全部元素+slogan第二个元素之后的所有(例如第一次循环时,slogan[:2]的值为“Just do it”)

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

使用道具 举报

 楼主| 发表于 2018-12-24 15:52:13 | 显示全部楼层
heidern0612 发表于 2018-12-24 15:14
上面的列表推导式,比较准确的是下面这段代码:


同意你的说法,是我表达的不太清楚,总之可以认为是‘’二次列表(或者多次)对该列表进行切片使用”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-26 11:12:35 | 显示全部楼层
我看到第五讲 感觉课后习题做着有点吃力了  有点难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-3 17:39:19 | 显示全部楼层
heidern0612 发表于 2018-12-23 09:43
要看懂这个首先你要明白list22中的列表引导式表达的意义。

list22 = [name + ':' + slogan[2:] for slog ...

get it 。开心(*^▽^*),灰常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-4 19:57:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 11:53:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-3 04:48:05 | 显示全部楼层
跟着老师学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-4 22:07:24 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 10:03:03 | 显示全部楼层

坟贴都能让你搞上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 10:03:23 | 显示全部楼层
liuhongrun2022 发表于 2023-8-5 10:03
坟贴都能让你搞上来

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

使用道具 举报

发表于 2023-8-5 10:07:51 | 显示全部楼层

编程追风梦被禁言了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-5 10:08:46 | 显示全部楼层
liuhongrun2022 发表于 2023-8-5 10:07
编程追风梦被禁言了!

我看到了,三天。
我的大号可能永久了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 18:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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