鱼C论坛

 找回密码
 立即注册
查看: 1119|回复: 16

[已解决]我编写的零基础学python第20讲作业,答案不对。想求教鱼油问题在哪

[复制链接]
发表于 2020-4-2 20:20:27 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 953211787 于 2020-4-2 21:26 编辑

小甲鱼的零基础学python第20讲动手作业最后一题



463ee0d70213e7daa83c189fa6e3afb.png

以下是我写的:
secret = '''这里面是一长串英文字符串'''
leng = len(secret)
last = leng -1
lie = []
for i in range(last):
    if secret[i] == '\n':
        continue
    if secret[i].islower()and secret[i-3:i].isupper() and secret[i+1:i+4].isupper() and secret[i-4].islower() and secret[i+4].islower():
        lie.append(secret[i])
我想知道为什么得到的答案和小甲鱼的不一样。答案比他的多了两个字母。问题在哪里
思路:如果secret是小写并且i前面和后面三个都是大写,而且前面第四个和后面第四个都是小写,那么i就是密码。
感觉完全符合题目要求,但是得出来的答案为什么就不对。
具体题目可以去看零基础入门学习python(不是最新版那个)第20讲,动动手作业最后一题

最佳答案
2020-4-2 21:33:09
判断的时候如果碰到\n会被分片当做1位字符加入到前后3个字符串里去,例如你多的第一个'u'是'IY\nuABN',[i-3:i]=''IY\n',isupper()结果是True,所以就误判了。所以要判断大写要每个字符逐个判断才行,参考下面的代码:
lenth = len(str1)
for i in range(lenth-4):
    allupper=True                                 #定义一个标量标志全部是大写
    if str1[i].islower():
        for each in str1[i-3:i]+str1[i+1:i+4]:    #遍历前3个+后3个字符
            if not each.isupper():                #有1个不是大写就跳出判断,标志改为False
                allupper=False
                break
        if allupper and (str1[i-4].islower()) and (str1[i+4].islower()):
            print(str1[i],end="")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-2 20:21:26 | 显示全部楼层

回帖奖励 +2 鱼币

你这个代码是从html上爬来的?为什么还有html标签?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 20:22:59 | 显示全部楼层
考虑一下越界的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 20:23:50 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 20:21
你这个代码是从html上爬来的?为什么还有html标签?

我直接复制的我的,爬的意思就是复制?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 20:26:01 | 显示全部楼层
BngThea 发表于 2020-4-2 20:22
考虑一下越界的问题

没有,发帖子的时候我看到没有缩进,我就手动按空格了。第一次发帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 20:28:03 | 显示全部楼层
953211787 发表于 2020-4-2 20:23
我直接复制的我的,爬的意思就是复制?

兄弟,你发的那个代码我有点看不懂。能不能稍微编辑一下,<p>这种标签能不能删掉,然后换行也整理一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 20:28:48 | 显示全部楼层
953211787 发表于 2020-4-2 20:23
我直接复制的我的,爬的意思就是复制?

噗,不是,为什么你的代码前后各有一个<p></p>呢?这个是html的标签
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 20:38:16 | 显示全部楼层
shatanzongcai 发表于 2020-4-2 20:28
兄弟,你发的那个代码我有点看不懂。能不能稍微编辑一下,这种标签能不能删掉,然后换行也整理一下

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

使用道具 举报

 楼主| 发表于 2020-4-2 20:38:46 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 20:28
噗,不是,为什么你的代码前后各有一个呢?这个是html的标签

改了,你看看,我就是不知道问题在哪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 21:33:09 | 显示全部楼层    本楼为最佳答案   
判断的时候如果碰到\n会被分片当做1位字符加入到前后3个字符串里去,例如你多的第一个'u'是'IY\nuABN',[i-3:i]=''IY\n',isupper()结果是True,所以就误判了。所以要判断大写要每个字符逐个判断才行,参考下面的代码:
lenth = len(str1)
for i in range(lenth-4):
    allupper=True                                 #定义一个标量标志全部是大写
    if str1[i].islower():
        for each in str1[i-3:i]+str1[i+1:i+4]:    #遍历前3个+后3个字符
            if not each.isupper():                #有1个不是大写就跳出判断,标志改为False
                allupper=False
                break
        if allupper and (str1[i-4].islower()) and (str1[i+4].islower()):
            print(str1[i],end="")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 21:39:36 | 显示全部楼层
txxcat 发表于 2020-4-2 21:33
判断的时候如果碰到\n会被分片当做1位字符加入到前后3个字符串里去,例如你多的第一个'u'是'IY\nuABN',='' ...

万分感谢,终于明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 21:52:54 | 显示全部楼层
本帖最后由 shatanzongcai 于 2020-4-2 21:55 编辑

我没有看懂楼主为什么要有last = leng -1 这一步,但是我大概可以解释为什么会有点出入。
楼主的这个方法并没有删除任何一个字符,每一个字符应该都会被使用,而小甲鱼的只要下一个字母不符合题意就清空前面所有操作,导致有些大写字母可能不满足前面的一组,而满足后面的那一组直接没能被再次使用而被清空了。
举个例子:
为了方便理解我们就只分大小写,在那一堆字符串里比方说有个字符串是这样的:‘aAAAaAAAaAAAaaAAAaAAaA’

如果使用小甲鱼的方法,得到的结果是这样的:a
使用l楼主的方法,得到的结果是:['a','a']

小甲鱼和楼主的结果不一样是因为,小甲鱼在经历第四个字符A时,发现它不符合题意,所以所有的count全都归零,也就等于这个代码切掉了不符合要求的前四个字符,变成了从‘aAAAaAAAaaAAAaA’这个字符串开始重新计算。那很明显,只有一个a是符合题意的。

总而言之,楼主的方法可以看成是切片,是允许两个7位字符串是有重合的,但是小甲鱼不是切片,小甲鱼的代码不存在两个合适的小写字符有大写字符重叠的可能。

个人的理解是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 16:35:34 | 显示全部楼层
shatanzongcai 发表于 2020-4-2 21:52
我没有看懂楼主为什么要有last = leng -1 这一步,但是我大概可以解释为什么会有点出入。
楼主的这个方法 ...

按照你说的这个‘aAAAaAAAaAAAaaAAAaAAaA’
答案应该是'aa',按照题目的意思也应该是aa
我的错误在于判别\n的时候会自动看成一个整体也就是换行符,所以造成的误判
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 16:39:49 | 显示全部楼层
txxcat 发表于 2020-4-2 21:33
判断的时候如果碰到\n会被分片当做1位字符加入到前后3个字符串里去,例如你多的第一个'u'是'IY\nuABN',='' ...

我还有个问题想请教一下,就是比如
secret = 'AaAAaAA'
if secret[0].isupper:
    print(111)


这个里面,我把secret[0]改成secret[1]为什么他还是会执行print(111)
if 不是只有在后面条件为True的时候才执行么

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

使用道具 举报

发表于 2020-4-3 20:50:16 | 显示全部楼层
isupper后面漏了括号,返回值是对象信息,象这样:<built-in method isupper of str object at 0x0000019A9AE04F30>,if总会通过。
secret = 'AaAAaAA'
if secret[1].isupper():
    print(111)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-3 21:38:48 | 显示全部楼层
953211787 发表于 2020-4-3 16:35
按照你说的这个‘aAAAaAAAaAAAaaAAAaAAaA’
答案应该是'aa',按照题目的意思也应该是aa
我的错误在于判 ...

好的,那我再看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-9 16:25:13 | 显示全部楼层
最佳答案似乎有个小问题:如果i-4<0,或者i+4=length无法检测。
比如说,如果str1='ABCdEFG',按照str1[i-4].islower()是检测不到的。
所以,更复杂点,还得分类讨论i的取值:

这是我写的:
length = len(str1)

for each in range(3, length-3):
    flag = 0                                #定义一个标量标志
    if str1[each] == '\n':
        continue
    elif str1[each].islower(): 
        if each == 3:                       #each==3,即前边只有三个字母
            if str1[each+4].isupper():      #判断后边第四个字母
                continue                    #如果第四个字母是大写,不符合题意,跳过后面进入下一轮循环
            else:
                for ea_ch in (str1[each-3:each] + str1[each+1:each+4]):
                    if not ea_ch.isupper():
                        flag = 1
                        break               #用break,因为不用再判断其余前后三个字母,跳出上一级for循环

        elif each == length-4:              #即后面只有三个字母
            if str1[each-4].isupper():      #判断前面第四个字母
                continue
            else:
               for ea_ch in (str1[each-3:each] + str1[each+1:each+4]):
                    if not ea_ch.isupper():
                        flag = 1
                        break

        else:
            if (str1[each-4].isupper()) or (str1[each+4].isupper()):
                continue
            else:
                for ea_ch in (str1[each-3:each] + str1[each+1:each+4]):
                    if not ea_ch.isupper():
                        flag = 1
                        break

        if flag == 0:                          #最后判断flag值是否改变
            print(str1[each], end='')
如果有问题欢迎指正!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 05:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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