对于特定的在线拼图,我必须抓住(使用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(检查源代码)
答案 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