匹配2个字符串之间的字符

时间:2013-12-11 03:02:05

标签: python string loops while-loop

我一直遇到这段代码的问题。似乎我对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超出范围,我得到索引错误。我很感激:

  1. 代码有什么问题;
  2. 我对缩进和while循环的理解不完整。

3 个答案:

答案 0 :(得分:1)

  

1.代码有什么问题

第12行中的错误:它应该是len(search)而不是len(searchn)

逐个错误:如果index == len(array)那么它已经结束了。在所有索引测试中删除+ 1

第4行中的剩余错误:在while条件下测试targetnsearchn。根据字符串中的数据,任何一个都可以先到达终点。 (将最终的searchn测试移到循环内部,luk32建议,也修复了这个错误,但不适用于搜索为空或长于目标的特殊情况。)

  

2.我对压痕和while循环的理解不完整。

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

但更重要的是,函数和变量的命名不是很清楚,代码的样式看起来非常像C。

<强>命名

在当前代码中(修复了错误),试试这个:

  • 将函数名称search_in_string更改为is_subsequence
  • 将变量名称search更改为partial
  • 将变量名称target更改为full
  • 同样将索引变量更改为ipartifull或类似的
  • 完全删除变量letterword
  • 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