miusa 发表于 2020-3-13 14:02:00

20讲课后题,为什么这代码跑出来是空的

关于1道题的2个问题哈~

课后题为:找出藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:a) 每位密码为单个小写字母;b) 每位密码的左右两边均有且只有三个大写字母,为了让题目简洁

1、代码中的字符段用参考答案可以跑出数据,但这样不行,求指点问题:
str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')
list1 = []
list2 = list(str1)

for each in list2:
    if each.islower():
      a = str1.find(each)
      if str1[(a-3):a].isupper():
            if str1[(a+1):(a+4)].isupper():
                if not str1.isupper():
                  if not str1.isupper():
                        print(each)
                        list1.append(each)
list3 = str(list1)
print(list3)


2、参考答案中有几处看不懂,标在注释中,求指点:
str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')

countA = 0
countB = 0
countC = 0

length = len(str1)

for i in range(length):
    if str1 == '\n':
      continue

    if str1.isupper():
      if countB:            #已设定countB = 0,为什么这里可以 if countB()?
            countC += 1
      else:
            countC = 0
            countA += 1

    if str1.islower():
      if countA != 3:      
            countA = 0
            countB = 0
            countC = 0
      else:
            if countB:          #这个if else不理解
                countA = 0
                countB = 0
                countC = 0
            else:
                countB = 1
                countC = 0
                target = i

    if countA == 3 and countC == 3:
      if i+1 != length and str1.isupper():
            countB = 0
            countC = 0
      else:
            print(str1,end=' ')
            countA = 3         #为什么这里不是 = 0?
            countB = 0
            countC = 0

txxcat 发表于 2020-3-13 15:21:43

本帖最后由 txxcat 于 2020-3-13 15:22 编辑

你的代码的问题是"a = str1.find(each)"这行,你要获取小写字母的位置,可是一个小写字母会重复出现若干次,而a只是第一个小写字母的位置,所以不可能出答案,其实获得字母的位置很简单,利用计数器,每次迭代加1,a就是真实的位置了。
str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')
list1 = []
list2 = list(str1)
a=0   #增加这行
for each in list2:
    if each.islower():
#      a = str1.find(each)   #删除这行
      if str1[(a-3):a].isupper():
            if str1[(a+1):(a+4)].isupper():
                if not str1.isupper():
                  if not str1.isupper():
                        print(a,each)
                        list1.append(each)
    a+=1    #增加这行
list3 = str(list1)
print(list3)


加了2行,删除1行就可以运行了,但是答案多了一个字母,是受到了'\n'的干扰,你把isupper的检查换成依次检查每个字母而不是检查3个字母的字符串就可以排除这个干扰了。

miusa 发表于 2020-3-16 13:27:32

txxcat 发表于 2020-3-13 15:21
你的代码的问题是"a = str1.find(each)"这行,你要获取小写字母的位置,可是一个小写字母会重复出现若干次 ...

懂了,多谢~
求解答案中的几个不懂的地方{:10_266:}

txxcat 发表于 2020-3-16 16:17:00

miusa 发表于 2020-3-16 13:27
懂了,多谢~
求解答案中的几个不懂的地方

str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')

countA = 0
countB = 0
countC = 0

length = len(str1)

for i in range(length):
    if str1 == '\n':
      continue

    if str1.isupper():
      if countB:
      #这是在for循环里运行,虽然第一次循环countB是0,但后面的循环中碰到有3个大写加一个小写countB会被修改为1,
      #这时就会对countC进行计算以判断右边是否有3个大写字母。
            countC += 1
      else:
            countC = 0
            countA += 1

    if str1.islower():
      if countA != 3:       #如果小写字母左边大写子母不足3个,计数清零
            countA = 0
            countB = 0
            countC = 0
      else:               #左边出现过3个连续大写字母而且当前字母是小写进入下面判断
            if countB:      #如果countB为1,说明上一个字母是小写字母,计数清零
                countA = 0
                countB = 0
                countC = 0
            else:             #剩余的情况是3个连续大些字母加一个小写字母,把countB赋值为1,记录下位置target
                countB = 1
                countC = 0
                target = i

    if countA == 3 and countC == 3:
      if i+1 != length and str1.isupper():
            countB = 0
            countC = 0
      else:
            print(str1,end=' ')
            countA = 3
         #找到了一个符合条件的字母,继续往下找的时候,右边的3个大写字母就成为了可能的下一个字母的左边3个字母了,
         #如果countA置为0,这3个大写字母就会被忽略,例如,'ABCaDEFbFHIccc',按照规则是'ab',如果countA为0,则b会被漏掉
            countB = 0
            countC = 0

miusa 发表于 2020-3-17 13:17:29

txxcat 发表于 2020-3-16 16:17


明白了,多谢~~~
页: [1]
查看完整版本: 20讲课后题,为什么这代码跑出来是空的