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: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个字母的字符串就可以排除这个干扰了。 txxcat 发表于 2020-3-13 15:21
你的代码的问题是"a = str1.find(each)"这行,你要获取小写字母的位置,可是一个小写字母会重复出现若干次 ...
懂了,多谢~
求解答案中的几个不懂的地方{:10_266:} 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
txxcat 发表于 2020-3-16 16:17
明白了,多谢~~~
页:
[1]