2个字符串之间的匹配字符
我一直有这段代码的问题。似乎我对Python中while循环和缩进的理解仍然不完整。2个字符串之间的匹配字符
在下面的代码中,我应该比较两个语句。如果第二个(搜索)语句中的字符位于第一个(目标)语句中,则结果应为“True”。否则,打印“假”。
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
超出范围。我将不胜感激:
- 这是什么问题的代码和;
- 我对indentations和while循环的理解是不完整的。
无法进入代码的逻辑。
编辑:好的,在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
我觉得这是写你的功能更简单的方法
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
“1.什么是错的代码“
错别字在12行:它应该是len(search)
而不是len(searchn)
。
Off-by-one错误:if index == len(array)then it is off off end。在所有指数测试中删除+ 1
。
第4行中的剩余错误:在while条件下同时测试targetn
和searchn
。根据字符串中的数据,任何一个都可以首先结束。(活动最终searchn测试循环中,即luk32建议,还修复了这个漏洞,而不是为特殊情况下,当搜索为空或超过目标更长的时间。)
“2.如果我的理解缩进和while循环不完整“
不,但可能是列表和数组索引。
但更重要的,功能的命名和变量都不是很清楚,而且代码的风格看起来非常像C.
命名
在当前的代码(与bug修复)试试这个:
- 变化的函数名
search_in_string
到is_subsequence
- 变化的变量名
search
到partial
- 变化的变量名
target
到full
- 同样改变索引变量
ipart
和ifull
或类似 - 除去变量
letter
和word
完全 - 与
full[ifull]
和word
与在测试中partial[ipart]
替换letter
现在不清楚了吗?
在这里,我也换成了互补的第二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
风格
节目风格看起来仍然像C与阵列,显式循环,并精心操作索引。您有机会了解一种称为“pythonic”的编码风格。请参阅https://stackoverflow.com/questions/58968/what-defines-pythonian-or-pythonic及其中的一些链接。
我想说gnibbler的答案是pythonic,但如果你不知道迭代器和列表理解,可能很难理解。这是另一个有点pythonic解决方案,我希望有一点容易阅读。但是,您需要了解阵列切片。
def is_subsequence(partial,full):
for char in full:
if partial.startswith(char):
partial = partial[1:]
return len(partial) == 0
您能否澄清一下这个函数应该做什么?我认为你的问题与逻辑有关,而不是缩进,但我不确定你要做什么。 (我最好的猜测是,当且仅当'target'是'search'的子串时,它应该返回'True'。) – zwol
对我来说,你的缩进看起来很好。我完全同意Zack的看法,你的逻辑看起来有点偏离。但是我们不知道这个功能应该做什么。预期的投入和产出是什么? – aIKid
谢谢,我做了编辑澄清 - 是的,代码应该在最后返回True或False。 – user3081750