解剖python puzzle forloop解决方案

时间:2016-09-29 02:08:24

标签: python for-loop encryption

对于特定的在线拼图,我必须抓住(使用python)每个小写字母,两边都用三个大写字母包围。例如,在'WExWQPoKLGnnNMOkPPOQ'中,应打印出ok字母。尽管我自己找到了一个随意的解决方案,但另一位参与者的具体解决方案引起了我的注意:

import string
word = ""
for i in range(len(code) - 8):
 if [c for c in code[i:i+9] if c in string.lowercase] == [code[i], code[i+4], code[i+8]]:
     word += code[i+4]

我想知道是否有人可以为我分解这段代码。我有一些具体的问题,但是破旧也会很棒:

  • 为什么code[i:i+9]不会生成TypeError: Can't convert 'int' object to str implicitly
  • string.lowercase在这个例子中做了什么?
  • 为什么code[i:i+9]会抓取9个字符而不是7个字符(中间有6个大写字母和小写字母)?
  • 如果code[i+8](满足要求的小写字母)是左边的4个空格,为什么还要检查[i+4]是否评估为真,特​​别是因为右边只有三个字符或正确的'信是相关的吗?

拼图本身可以在这里找到:http://www.pythonchallenge.com/pc/def/equality.html(检查源代码)

2 个答案:

答案 0 :(得分:3)

  

为什么code [i:i + 9]不会产生TypeError:无法隐式地将'int'对象转换为str?

为什么会这样?它只是一个切片表示法,i是一个int,code是一个字符串。

  

string.lowercase在这个例子中做了什么?

这是一个包含所有小写字母的常量。 (它在Python 3中不再存在,因为它依赖于语言环境。)

  

为什么代码[i:i + 9]会抓取9个字符而不是7个字符(中间有6个大写字母和小写字母)?

根据问题的实际描述,小写字母必须“正确包围三个”大写字母。所以你不能只检查7,你需要全部9。

  

如果[i + 4](满足要求谜题的小写字母)是左边4个空格,为什么还要检查代码[i + 8]的结果是否为真,特别是因为只有3个字符位于右边或左边“正确”的字母是否相关?

同样,它不仅是3个相关的字符,而是4个。第4个字符必须是小写字母。

这段代码的作用是它过滤9个字母的切片以仅保留小写,并检查这是否恰好是第1个,第5个和最后一个字母。

答案 1 :(得分:1)

在每次迭代中,code[i:i+9]提取code字符串中9个连续字母的序列。例如,第一次WExWQPoKL。下一次迭代将给出ExWQPoKLG

在每次迭代中,在这9个字母中,1,2,3和5,6,7位置应为大写字母,因此不会出现在[c for c in code[i:i+9] if c in string.lowercase]的结果中。只有位置0,4和8(记住python中的位置从0开始)。如果是这种情况,则意味着位置4(中间)的字符被左侧(1,2,3)和右侧(5,6,7)的3个大写字母包围。

这意味着如果字符串code是“ABCdEFG”,则您发布的代码不会返回字母“d”。我会改为:

import string
code ="ABCdEFGhIJK"
word = []
for i in range(len(code) - 6):
  if [c for c in code[i:i+7] if c in string.lowercase] == [code[i+3]]:
     word += code[i+3]

print word
print code

这打印(python2)

['d', 'h']
ABCdEFGhIJK