鱼C论坛

 找回密码
 立即注册
查看: 1925|回复: 23

[已解决]同志们呐,我这个代码为啥结果出来是空啊(零基础入门学python 的第20讲动手01题)

[复制链接]
发表于 2018-1-14 23:33:32 | 显示全部楼层 |阅读模式

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

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

x
这是零基础入门学python 的第20讲动手01题

  1. def code(string):
  2.         list1=[]
  3.         for each in string:
  4.                 position=string.index(each)
  5.                 headsubstring=string[position-3:position]
  6.                 tailsubstring=string[position+1:position+4]
  7.                 if position<3:
  8.                         continue
  9.                 elif position==3:
  10.                         if each.islower()!=True:
  11.                                 continue
  12.                         elif each.islower():
  13.                                 check2=string[position+4]
  14.                                 if check2.islower()!=True:
  15.                                         continue
  16.                                 else:
  17.                                         if headsubstring.isupper():
  18.                                                 if tailsubstring.isupper():
  19.                                                         list1.append(each)
  20.                 elif position>3:
  21.                         if each.islower()==False:
  22.                                 continue
  23.                         elif each.islower():
  24.                                 check1=string[position-4]
  25.                                 check2=string[position+4]
  26.                                 if check1.islower()!=True:
  27.                                         continue
  28.                                 elif check1.islower()!=True:
  29.                                         continue
  30.                                 else:
  31.                                         if headsubstring.isupper():
  32.                                                 if tailsubstring.isupper():
  33.                                                         list1.append(each)

  34.         print(list1)

  35. code('''ACFlCTLIQlAIVMTqHFkswqbDDHtpgcWaXSSglUYKE
  36. lqNs...中间省略qnpjwJEaDYoehEklEgJyiksGxdEKgfYRXQecRZgfe
  37. qKWGc''')
复制代码


在ubutun上运行后结果如图。。。。我的思维其实和简单,就是先判断前4个字符是否符合要求,然后再看其他的,分析思路呢是这样的,先看each是不是小写,是的话再看each前面的第4个和后面的第4个(由近向远数)是不是小写,不是的话直接跳过,是的话就看each的前三个和后三个是不是全部都是大写,是的话就append列表嘛!!!结果。。。。。出来的结果是空的,当然这里头有个地方我没考虑到,就是那串字符串里是不是由\n这个,但是先不考虑这个因素,我现在就是看不出来我这个代码是哪里由问题。。。。
最佳答案
2018-1-15 16:25:17
本帖最后由 yjsx86 于 2018-1-15 16:27 编辑
三与七之间 发表于 2018-1-15 16:02
@yjsx68 直接粘贴总是说要审核,文本放在附件里了。。。。

  1. import re

  2. S = '''你的文本'''
  3. rs = re.findall(r'[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]',S)
  4. print(''.join(rs))
复制代码


第一次写的正则为:[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z] 但是答案明显不对
后来改为 [^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z] 答案出来了 ilovefishc 但是这种写法对于文本的开头和结尾的 AAAaAAA 是不能匹配的
尝试过[^A-Z]?[A-Z]{3}([a-z])[A-Z]{3}[^A-Z]? 答案错误 所以将就用吧
完美的解决办法想不出来
Screenshot from 2018-01-14 07-26-32.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-15 00:22:16 From FishC Mobile | 显示全部楼层
本帖最后由 h20060304 于 2018-1-15 23:07 编辑

写了一份代码,自己参考吧。

适用于任何情形的   纯字母 字符串。

之前的逻辑还有些问题,重新更新代码如下,并加了注释,整死我啦!

  1. import re

  2. test = 'AACcDEDiEEEpEEqEEElEEEoFDFvLLDsKbLDKeOOO'
  3. # test = 'cAACVcccccccCDDeCCCfCC'
  4. code = ''
  5. while test:
  6.     # 确定字符串中是否有小写字母
  7.     if not test.isupper():
  8.         # 获取原始字符串第一个小写字母
  9.         first_low_character = re.findall('[a-z]', test)[0]
  10.         # 获取第一个小写字母的索引
  11.         first_low_index = test.index(first_low_character)
  12.         # 判断第一个小写字母前面是否恰好有 3 个大写字母
  13.         if first_low_index == 3:
  14.             # 将 AAAb 删除 更新字符串
  15.             test = test[first_low_index + 1:]
  16.             # 检查更新后的字符串是否为空 并确定是否有小写字母
  17.             if test and not test.isupper():
  18.                 # 获取更新后的字符串第一个小写字母
  19.                 two_low_character = re.findall('[a-z]', test)[0]
  20.                 # 获取更新后的字符串第一个小写字母的索引
  21.                 two_low_index = test.index(two_low_character)
  22.                 # 判断更新后的字符串第一个小写字母 前面 是否恰好有 3 个大写字母
  23.                 # 也就是
  24.                 # 判断原始字符串第一个小写字母 后面 是否恰好有 3 个大写字母
  25.                 # 上面这两句话 意义相同
  26.                 if two_low_index == 3:
  27.                     # 存储满足条件的小写字母
  28.                     code += first_low_character
  29.                 else:
  30.                     # 更新字符串
  31.                     test = test[two_low_index + 1:]
  32.             else:
  33.                 # 判断更新后的字符串恰好有 3 个大写字母
  34.                 if len(test) == 3:
  35.                     # 存储满足条件的小写字母
  36.                     code += first_low_character
  37.         else:
  38.             # 更新字符串
  39.             test = test[first_low_index + 1:]
  40.     else:
  41.         # 字符串中已经没有小写字母 直接退出循环
  42.         break

  43. print(code)

  44. if code == 'cilove':
  45.     print('测试成功!')
  46. else:
  47.     print('测试失败!')
复制代码

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

使用道具 举报

发表于 2018-1-15 03:11:36 | 显示全部楼层
本帖最后由 yjsx86 于 2018-1-15 03:51 编辑

题目要求是什么?
我没做过小甲鱼的课后题
不过我第一想到的是用正则 2~3行应该可以解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 08:51:49 | 显示全部楼层
yjsx86 发表于 2018-1-15 03:11
题目要求是什么?
我没做过小甲鱼的课后题
不过我第一想到的是用正则 2~3行应该可以解决

兄弟能用正则表达式写一个看看嘛?我们学习下,非常谢谢,一直想学正则表达式,感觉好负责,能看个实际应用对比的效果应该会很好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 10:17:48 | 显示全部楼层
你这主要问题我测试了一下,应该出在index上,程序里边position=string.index(each)这句话,相同的字母的index总是和第一个出现的字母的索引是一样的,如code('''ACFlCTLIQlAIVMTqHFkswqbDDHtpgcWaXSSglUYKE
lqNs...中间省略qnpjwJEaDYoehEklEgJyiksGxdEKgfYRXQecRZgfeqKWGc''')这里边的C字母,当each=C时,无乱在字符串那个位置的C,position总是等于第一个C的索引1,所以你的程序就乱了。
另把你的程序按揣测你的意思修改测试了下(一个小写字母前边与后边3个都是大写字母,而且前后边第4个还的是小写,满足以上条件的小写字母就拿出来),能通过,但是真是乱,凑合着看看吧,希望对你能有帮助。
def code(string):
        list1=[]
        i=0
        d=len(string)-4
        
        for each in string:
               
               
                if i<3:
                    
                    i+=1
                    continue
                elif i==3:
                        if each.islower()!=True:
                           
                            i+=1
                            continue
                        elif each.islower():
                                check2=string[i+4]
                                if check2.islower()!=True:                                    
                                    i+=1
                                    continue
                                else:
                                    if string[i-3:i].isupper() == True:                                       
                                        if string[i+1:i+4].isupper()==True:
                                            list1.append(each)
                elif d>i>3:
                    headsubstring=string[i-3:i]
                    tailsubstring=string[i+1:i+4]
                    if each.islower()==False:
                        i+=1
                     
                        continue
                    else:
                        check1=string[i-4]
                        check2=string[i+4]
                        if check1.islower()!=True:                           
                            i+=1
                            continue
                                       
                        elif check2.islower()!=True:
                           
                            i+=1
                            continue
                                       
                        else:
                           
                            if headsubstring.isupper():
                              
                                if tailsubstring.isupper():
                                   
                                    list1.append(each)
                                
               
                i+=1

        print(list1)
code('cFSCbSKFdDlGFGSWSDPLOIUEYSSaaaasascWWWFFFWFFFdFFFkFFFhFsFFFdGFFsGGGGffffffff')
另外当i=3时,也就是第4个字母是小写时,那里没写检测前边第4个是否是小写的情况,你可以适当的添加上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 14:00:01 | 显示全部楼层
冰封雪舞 发表于 2018-1-15 08:51
兄弟能用正则表达式写一个看看嘛?我们学习下,非常谢谢,一直想学正则表达式,感觉好负责,能看个实际应 ...

题目要求是什么?
是找到类似 AAAaAAAbBBBcAAA 然后把小写的取出来么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-15 14:10:20 | 显示全部楼层
yjsx86 发表于 2018-1-15 14:00
题目要求是什么?
是找到类似 AAAaAAAbBBBcAAA 然后把小写的取出来么?

抱歉,回复晚啦,题目的要求是这样的:
请用已学过的知识编写程序,找出小甲鱼藏在下边的这个长字符串中的密码,密码的埋藏地点符合以下规律:
a)每位密码为单个小写字母
b)每位密码的左右两边均有且只有三个大写字母
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-15 14:12:07 | 显示全部楼层
h20060304 发表于 2018-1-15 00:25
你的目的是要找类似于     AAAAbCCCC这样的字符串吗?

题目要求是这样的:
请用已学过的知识编写程序,找出小甲鱼藏在下边的这个长字符串中的密码,密码的埋藏地点符合以下规律:
a)每位密码为单个小写字母
b)每位密码的左右两边均有且只有三个大写字母
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-15 14:13:07 | 显示全部楼层
h20060304 发表于 2018-1-15 00:24
4,自己可以用较短号,例如英文单词,去尝试把逻辑写在纸上,并试验,会更有利

好的!经验get~~谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-15 14:14:37 | 显示全部楼层
h20060304 发表于 2018-1-15 00:30
根据你下面的文本,我简单推测分析一下,给你写思路:
1,对于字符串中的字符,要去判断某个字符的往前第4 ...

我是要把所有符合要求的中间的那个小写字母提出来,组成一个密码。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-15 14:15:38 | 显示全部楼层
yjsx86 发表于 2018-1-15 03:11
题目要求是什么?
我没做过小甲鱼的课后题
不过我第一想到的是用正则 2~3行应该可以解决

嗯呢,我也想学习一下正则表达式~~~~~求教~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-15 14:18:10 | 显示全部楼层
冰封雪舞 发表于 2018-1-15 10:17
你这主要问题我测试了一下,应该出在index上,程序里边position=string.index(each)这句话,相同的字母的in ...

艾玛,index是返回的第一个出现的each的索引值啊原来!!!好吧。。。。忧桑了,我的代码写的确实是。。。。。。。嘻嘻嘻,羞愧羞愧。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 15:20:13 | 显示全部楼层
三与七之间 发表于 2018-1-15 14:15
嗯呢,我也想学习一下正则表达式~~~~~求教~~

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

使用道具 举报

 楼主| 发表于 2018-1-15 15:54:04 | 显示全部楼层

稍微等等哈~直接复制的。。。。说要审核一下才能发布。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-15 16:02:17 | 显示全部楼层
本帖最后由 三与七之间 于 2018-1-15 16:05 编辑

@yjsx68 直接粘贴总是说要审核,文本放在附件里了。。。。

string2.zip

6.17 KB, 下载次数: 4

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

使用道具 举报

发表于 2018-1-15 16:25:17 | 显示全部楼层    本楼为最佳答案   
本帖最后由 yjsx86 于 2018-1-15 16:27 编辑
三与七之间 发表于 2018-1-15 16:02
@yjsx68 直接粘贴总是说要审核,文本放在附件里了。。。。

  1. import re

  2. S = '''你的文本'''
  3. rs = re.findall(r'[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]',S)
  4. print(''.join(rs))
复制代码


第一次写的正则为:[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z] 但是答案明显不对
后来改为 [^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z] 答案出来了 ilovefishc 但是这种写法对于文本的开头和结尾的 AAAaAAA 是不能匹配的
尝试过[^A-Z]?[A-Z]{3}([a-z])[A-Z]{3}[^A-Z]? 答案错误 所以将就用吧
完美的解决办法想不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-15 16:38:10 | 显示全部楼层
yjsx86 发表于 2018-1-15 16:25
第一次写的正则为:[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z] 但是答案明显不对
后来改为 [^A-Z][A-Z]{3} ...

没关系,就算不完美也够我琢磨好一阵子了,请接受我的膝盖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 16:45:29 | 显示全部楼层
三与七之间 发表于 2018-1-15 16:38
没关系,就算不完美也够我琢磨好一阵子了,请接受我的膝盖

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

使用道具 举报

 楼主| 发表于 2018-1-15 17:35:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 17:53:32 | 显示全部楼层
yjsx86 发表于 2018-1-15 16:25
第一次写的正则为:[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z] 但是答案明显不对
后来改为 [^A-Z][A-Z]{3} ...

该正则表达式 不正确,我在这里 给一个反例。请自己测试。

'AACcqDEDiEEEpEEqEEElEEEoFDFvLLDsKbLDKeOOO'

密码应该是  ilove

但实际测试结果是 il
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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