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超出范围。我将不胜感激:

  1. 这是什么问题的代码和;
  2. 我对indentations和while循环的理解是不完整的。
+2

您能否澄清一下这个函数应该做什么?我认为你的问题与逻辑有关,而不是缩进,但我不确定你要做什么。 (我最好的猜测是,当且仅当'target'是'search'的子串时,它应该返回'True'。) – zwol

+0

对我来说,你的缩进看起来很好。我完全同意Zack的看法,你的逻辑看起来有点偏离。但是我们不知道这个功能应该做什么。预期的投入和产出是什么? – aIKid

+0

谢谢,我做了编辑澄清 - 是的,代码应该在最后返回True或False。 – user3081750

无法进入代码的逻辑。

编辑:好的,在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条件下同时测试targetnsearchn。根据字符串中的数据,任何一个都可以首先结束。(活动最终searchn测试循环中,即luk32建议,还修复了这个漏洞,而不是为特殊情况下,当搜索为空或超过目标更长的时间。)

2.如果我的理解缩进和while循环不完整

不,但可能是列表和数组索引。

但更重要的,功能的命名和变量都不是很清楚,而且代码的风格看起来非常像C.

命名

在当前的代码(与bug修复)试试这个:

  • 变化的函数名search_in_stringis_subsequence
  • 变化的变量名searchpartial
  • 变化的变量名targetfull
  • 同样改变索引变量ipartifull或类似
  • 除去变量letterword完全
  • 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