我一直遇到这段代码的问题。似乎我对Python中while循环和缩进的理解仍然不完整。
在下面的代码中,我应该比较两个语句。如果第二个(搜索)语句中的字符位于第一个(目标)语句中,则结果应为“True”。否则,打印“False”。
x = "I am a horse."
y = "a r"
targetn
指的是目标字符串searchn
是指搜索字符串中的索引letter
指的是目标字符串word
指的是搜索字符串中的字符def search_in_string(search, target):
targetn = 0
searchn = 0
while (targetn + 1) != len(target):
letter = target[targetn]
word = search[searchn]
if word == letter:
targetn = targetn + 1
searchn = searchn + 1
if word != letter:
targetn = targetn + 1
if (searchn + 1) == len(searchn):
return True
else:
return False
print search_in_string(y, x)
在Python中运行代码时,由于searchn
超出范围,我得到索引错误。我很感激:
答案 0 :(得分:1)
“ 1.代码有什么问题”
第12行中的错误:它应该是len(search)
而不是len(searchn)
。
逐个错误:如果index == len(array)那么它已经结束了。在所有索引测试中删除+ 1
。
第4行中的剩余错误:在while条件下测试targetn
和searchn
。根据字符串中的数据,任何一个都可以先到达终点。 (将最终的searchn测试移到循环内部,luk32建议,也修复了这个错误,但不适用于搜索为空或长于目标的特殊情况。)
“ 2.我对压痕和while循环的理解不完整。”
不,但可能是列表和数组索引。
但更重要的是,函数和变量的命名不是很清楚,代码的样式看起来非常像C。
<强>命名强>
在当前代码中(修复了错误),试试这个:
search_in_string
更改为is_subsequence
search
更改为partial
target
更改为full
ipart
和ifull
或类似的letter
和word
letter
中将full[ifull]
替换为word
,将partial[ipart]
替换为if
现在不是更清楚吗?
在这里,我还用明显的else
替换了补充的第二个def is_subsequence(partial, full):
ifull = 0
ipart = 0
while ifull != len(full) and ipart != len(partial):
if partial[ipart] == full[ifull]:
ifull = ifull + 1
ipart = ipart + 1
else:
ifull = ifull + 1
if ipart == len(partial):
return True
else:
return False
测试:
def is_subsequence(partial,full):
for char in full:
if partial.startswith(char):
partial = partial[1:]
return len(partial) == 0
<强>风格强>
程序样式仍然看起来像C,带有数组,显式循环和精心操作的索引。这是一个让您了解称为“pythonic”的编码风格的机会。请参阅https://stackoverflow.com/questions/58968/what-defines-pythonian-or-pythonic以及其中的几个链接。
我会说gnibbler的答案是pythonic,但如果你不知道迭代器和列表理解,可能很难理解。这是另一个有点pythonic的解决方案,我希望它更容易阅读。但是,您需要了解数组切片。
{{1}}
答案 1 :(得分:0)
没有进入代码的逻辑。
编辑:好的,if
后卫的意图有误。
但是,零长度参数也是一个问题。
x = "I am a horse."
y = "a r"
def search_in_string(search, target):
targetn = 0
searchn = 0
while (targetn + 1) != len(target):
letter = target[targetn]
word = search[searchn]
if word == letter:
targetn = targetn + 1
searchn = searchn + 1
if word != letter:
targetn = targetn + 1
#This will get executed AFTER the WHILE loop
if (searchn + 1) == len(search):
return True
else:
return False
print(search_in_string(x,y))
工作代码:
def search_in_string(search, target):
targetn = 0
searchn = 0
while (targetn + 1) != len(target):
letter = target[targetn]
word = search[searchn]
if word == letter:
targetn = targetn + 1
searchn = searchn + 1
if word != letter:
targetn = targetn + 1
#This will get executed WITHIN the WHILE loop
if (searchn + 1) == len(search):
return True
else:
return False
答案 2 :(得分:0)
我认为有一种更简单的方法来编写你的功能
def search_in_string(search, target):
iter_t = iter(target)
return all(c in iter_t for c in search)
例如:
>>> search_in_string("a r", "I am a horse.")
True
>>> search_in_string("a re", "I am a horse.")
True
>>> search_in_string("a er", "I am a horse.")
False