鱼C论坛

 找回密码
 立即注册
查看: 1790|回复: 12

[已解决]20课时,动手02疑问

[复制链接]
发表于 2018-12-2 16:11:07 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Stubborn 于 2018-12-3 21:11 编辑

动手02如题:找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a) 每位密码为单个小写字母
b) 每位密码的左右两边均有且只有三个大写字母
密码本:

我的思路是,1,既然密码是小写,我首先判定,这个字符串到底是不是小写。如果这个字符串是小写,我再判定,这个字符串的前三个长度,是不是全部是大写,如果这个前三个字符串都是大写,我再判定这个字符串后 三个长度,是不是全部是大写,如果是,判定这个字符串属于“密码”,添加到列表。首先问下,我 是不是对题目理解错了。下面贴上我的代码:
  1. file_object = open("string2.txt")
  2. text = file_object.read()
  3. lenght = len(text)  #字符串长度
  4. txt_list = [] #存放密码
  5. for i in range(lenght):
  6.     if text[i].islower():
  7.         if text[i-3:i].isupper():
  8.             if text[i+1:i+3].isupper():
  9.                 txt_list.append(text[i])
  10.             else:
  11.                 continue
  12.         else:
  13.             continue
  14.     else:
  15.         continue

  16. print(''.join(txt_list))
复制代码

得到的处理数据和鱼C老师的答案不一样。鱼C老师的答案处理结果是:ilovefishc。我处理的就差远了。是不是我对题目理解偏了?有大佬讲解下吗?非常感谢,最好大佬们有自己觉得思路或者答案,也帮忙评论下、。
---------------------------------------------------分割线-------------------------------------------------------------------------------------------
首先,理解有点问题,b,有,且只有三个大写字母。意思就是xAAAxAAAx 只有这种才符合题意,其他的AAAAxAAAAA ,这种是不合符的。
第二。一楼版主,判断越界,需要加一个限制,在for i in range(3,lenght-3): 密码只能从第四个单位长度判断,和倒数第四个单位长度判断。似乎改成在后面两个if判断中还是有越界,应该要改成5,但是5似乎也不有矛盾的感觉,思路不对?刚刚想到,既然是这样,我单独判断前面AAAxAAAA(8位长度)和后面单独8位,虽然有些麻烦,好歹是自己的思路,OKOKOK
--------------------------------------------------最终结果------------------------------------
  1. file_object = open("string2.txt")
  2. text = file_object.read()
  3. file_object.close()
  4. lenght = len(text)  #字符串长度
  5. txt_list = [] #存放密码
  6. for i in range(3, lenght-3):
  7.     if '\n' in text[i-3:i+4]:  #若果是换行符,跳过
  8.         continue
  9.     if text[i].islower():
  10.         if (text[i-3:i]==text[i-3:i].upper()) and (text[i-4:i]!=text[i-4:i].upper()):  #如果前三等于前三转换成大写的字母,而且前面四个字母不等于后面四个转换成大些的字母
  11.             if (text[i+1:i+4] == text[i+1:i+4].upper()) and (text[i+1:i+5] != text[i+1:i+5].upper()):  #判断后面的
  12.                 txt_list.append(text[i])    #全部判断完成 认定是密码,添加到密码列表
  13.             else:
  14.                 continue
  15.         else:
  16.             continue
  17.     else:
  18.         continue

  19. print(''.join(txt_list))  # 把列表打印成字符串
复制代码


思路02.其他渔友:
  1. with open(r'string2.txt') as f:
  2.         s=f.read()
  3.         s=''.join(filter(str.isalpha,s))
  4.         pwd=''
  5.         for i in range(len(s)):
  6.             if s[i].islower():
  7.                 if s[i-4].islower() and s[i-3:i].isupper() \
  8.                 and s[i+1:i+4].isupper() and s[i+4].islower():
  9.                     pwd+=s[i]
  10.         print(pwd)
复制代码


思路修改其他渔友:
  1. file_object = open("string2.txt")
  2. text = file_object.read()
  3. lenght = len(text)  #字符串长度
  4. txt_list = [] #存放密码
  5. for i in range(4,lenght-4):
  6.     if text[i].islower(): #先判断目标是不是小写
  7.         t1 = text[i-4:i+5]#截取xXXXxXXXx
  8.         if t1.isalpha():#判断xXXXxXXXx是否全是字母
  9.             t2 = t1[0]+t1[4]+t1[8]   #判断t2全部为小写
  10.             t3 = t1[1:4]+t1[5:8]      #判断t3全部为大写
  11.             if t2.islower() and t3.isupper():    #判定成功,加入密码列表
  12.                 print(t1[4],end='')
  13.                
  14.         


  15. print(''.join(txt_list))
复制代码

最佳答案
2018-12-2 21:25:23
楼上版主正解,要正确理解索引和isupper方法。
由于这里字符串设置的比较简单,想要简单的看到结果可以作个弊实现(换个字符串就不行了):
  1. file_object = open("string2.txt")
  2. text = file_object.read()
  3. file_object.close()
  4. lenght = len(text)  #字符串长度
  5. txt_list = [] #存放密码
  6. for i in range(5, lenght-5):
  7.     if '\n' in text[i-3:i+4]:
  8.         continue
  9.     if text[i].islower():
  10.         if (text[i-3:i]==text[i-3:i].upper()) and (text[i-4:i]!=text[i-4:i].upper()):
  11.             if (text[i+1:i+4] == text[i+1:i+4].upper()) and (text[i+1:i+5] != text[i+1:i+5].upper()):
  12.                 txt_list.append(text[i])
  13.             else:
  14.                 continue
  15.         else:
  16.             continue
  17.     else:
  18.         continue

  19. print(''.join(txt_list))
复制代码

string2.zip

6.17 KB, 下载次数: 7

密码本

评分

参与人数 1荣誉 +3 收起 理由
Garywang + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-2 18:27:56 | 显示全部楼层
1. text[i-3:i]会越界,如i=0时。i-3就是-3了,虽然切片不报错,但结果肯定不对。
2.对islower和isupper理解不对,islower并不是都是全为小写字母时才为True,而是没有大写字母就为True
>>> '!@1q'.islower()
True
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-2 18:51:55 | 显示全部楼层
版主说的对,你切片判断为负的时候,值已经不准确了。

另外你这种判断存在超index的情况,如果i已经是最后一个值了,i+3又谈何说起呢?

还是理解下老师的思路,然后自己再想想吧。

给个地址我之前分析的:

戳我前进
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-2 21:25:23 | 显示全部楼层    本楼为最佳答案   
楼上版主正解,要正确理解索引和isupper方法。
由于这里字符串设置的比较简单,想要简单的看到结果可以作个弊实现(换个字符串就不行了):
  1. file_object = open("string2.txt")
  2. text = file_object.read()
  3. file_object.close()
  4. lenght = len(text)  #字符串长度
  5. txt_list = [] #存放密码
  6. for i in range(5, lenght-5):
  7.     if '\n' in text[i-3:i+4]:
  8.         continue
  9.     if text[i].islower():
  10.         if (text[i-3:i]==text[i-3:i].upper()) and (text[i-4:i]!=text[i-4:i].upper()):
  11.             if (text[i+1:i+4] == text[i+1:i+4].upper()) and (text[i+1:i+5] != text[i+1:i+5].upper()):
  12.                 txt_list.append(text[i])
  13.             else:
  14.                 continue
  15.         else:
  16.             continue
  17.     else:
  18.         continue

  19. print(''.join(txt_list))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 22:29:31 | 显示全部楼层
冬雪雪冬 发表于 2018-12-2 18:27
1. text会越界,如i=0时。i-3就是-3了,虽然切片不报错,但结果肯定不对。
2.对islower和isupper理解不对 ...

1,.越界问题,可以在rang循环加限定吗rang(4,lenght-3)
2,这里是单独一个字母判断,密码本都是大小写全部只有英文,这种情况应该可以适用把。islower(),一个字符串中只要含有小写,且不含大写都会返回True值,这样理解对吗?issupper相反是吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 22:30:44 | 显示全部楼层
heidern0612 发表于 2018-12-2 18:51
版主说的对,你切片判断为负的时候,值已经不准确了。

另外你这种判断存在超index的情况,如果i已经是最 ...

.越界问题,可以在rang循环加限定吗,比如rang(4,lenght-3)。
我想知道,这样的思路是不是没有问题,题目没有理解错。您的笔记我待会去看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-2 22:34:49 | 显示全部楼层
Stubborn 发表于 2018-12-2 22:29
1,.越界问题,可以在rang循环加限定吗rang(4,lenght-3)
2,这里是单独一个字母判断,密码本都是大小写 ...

1.可以
2.全是英文字母可以,但本例中有其它字符,就不行了。
如:
>>> 'b!@##a'.islower()
True
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 22:34:55 | 显示全部楼层
幻千城12 发表于 2018-12-2 21:25
楼上版主正解,要正确理解索引和isupper方法。
由于这里字符串设置的比较简单,想要简单的看到结果可以作 ...

非常感谢,至少我的思路与没有错。我看下代码运行,。和自己的错误在哪里
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 22:48:31 | 显示全部楼层
幻千城12 发表于 2018-12-2 21:25
楼上版主正解,要正确理解索引和isupper方法。
由于这里字符串设置的比较简单,想要简单的看到结果可以作 ...

前三个大写,后三个大写,不应该是从字符长度3开始判断吗,0,1,2,3,4,5,6,为什么从5开始的  我试过了从3开始也OK的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 23:19:30 | 显示全部楼层
冬雪雪冬 发表于 2018-12-2 22:34
1.可以
2.全是英文字母可以,但本例中有其它字符,就不行了。
如:

谢谢大神指点,关于这两个函数,这样理解没有问题把。
islower(),一个字符串中只要含有小写,且不含大写都会返回True值,这样理解对吗?issupper相反是吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 23:34:18 | 显示全部楼层
幻千城12 发表于 2018-12-2 21:25
楼上版主正解,要正确理解索引和isupper方法。
由于这里字符串设置的比较简单,想要简单的看到结果可以作 ...

前三个大写,后三个大写,不应该是从字符长度3开始判断吗,0,1,2,3,4,5,6,为什么从5开始的  我试过了从3开始也OK的。看了后面代码,知道了,为什么设置5,判断密码从3开始,但是设置3又会有“越界”问题,是不是这个思路不行?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-2 23:35:57 | 显示全部楼层
heidern0612 发表于 2018-12-2 18:51
版主说的对,你切片判断为负的时候,值已经不准确了。

另外你这种判断存在超index的情况,如果i已经是最 ...

,密码从3单位开始判断,似乎改成3在后面两个if判断中还是有越界,应该要改成5,但是5似乎也对,有矛盾的感觉,思路不对?是不是我这个思路不行,大佬????大佬有其他的思路可以解决吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-3 08:09:19 | 显示全部楼层
Stubborn 发表于 2018-12-2 23:19
谢谢大神指点,关于这两个函数,这样理解没有问题把。
islower(),一个字符串中只要含有小写,且不含大写 ...

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 12:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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