2017-07-25 43 views
0

我正在写一个函数来检查字符串中'a'和'b'之间的距离是否为3,使用以下函数。对于输入字符串“Laura sobs”,'s'的值被存储为1(最早出现的'a')而不是4(最后一次出现'a'),并且我得到错误的输出。我该如何解决?Python:存储最早发生的字符索引,而不是最后一个

def ABCheck(str): 
    for i in str: 
     if i == 'a': 
      s = str.index(i) 
     elif i == 'b': 
      t = str.index(i) 
      # print (b) 
    return (abs(s-t)==4) 

回答

0

使用enumerate来循环字符串,同时保持索引。然后,当你找到'a'时,只要检查角色3的位置是否是'b'即可。

def abcheck(s): # Don't use str, it's the name of a builtin 
    for idx, c in enumerate(s[:-3]): # No need to iterate over the last part 
     if c == 'a' and s[idx+3] == 'b': 
      return True 
    return False 
+0

感谢@RemcoGerlich,它在我使用'枚举'但'enumerate(s [:3])'不起作用时起作用。你能解释这部分吗? “你不需要重复最后一部分”是什么意思?是的,我不使用'str'作为变量名,它来自网站:) – Sri

+0

我的意思是'-3'。因为如果你在最后三个字符中找到一个'a',那么没有足够的空间让'b'有三个字符,所以不需要检查它们(否则你必须确保你不要在字符串结束之后的索引)。 – RemcoGerlich

+0

非常感谢!我学到了枚举函数是多么有用:)只是一个小修正,它应该是'4'而不是'3'并且添加s [idx-4] =='b'与'或' – Sri

0

你的代码看起来非常硬编码到只检查的实例,其中的区别是3和字母必须是“A”或“B”,而不是输入从某处。

如果您是初学者尝试构建某些东西,我认为这不是一个好习惯。但是,如果你很确定这就是你想要的东西(一个函数,只处理这个特定的情况下),然后通过各种手段:

def ABCheck(str): 
    s = -1 
    t = -1 
    for i in str: 
     if i == 'a' and s == -1: 
      s = str.index(i) 
     elif i == 'b' and t == -1: 
      t = str.index(i) 
      # print (b) 
    return (abs(s-t)==3) 

只是初始化都为-1,并检查它。一旦它们的值第一次被覆盖,它们将不再更新。

编辑:

def ABCheck(string): 
    s = -1 
    t = -1 
    for i in string: 
     if i == 'a' and s == -1: 
      s = string.index(i) 
     elif i == 'b' and t == -1: 
      t = string.index(i) 
      # print (b) 
    return (abs(s-t)==4) 

它不会因为你的代码工作(这是我抄)最初使用STR这是一个保留关键字。

+0

不,它不工作!这是来自coderbyte的代码挑战,它必须专门检查字符串中'a'和'b'位置之间的差异是否为3,这就是为什么它是硬编码的:) – Sri

+0

@Sri它不起作用,因为您的代码(我复制)最初使用str是一个保留关键字。你可能真的试图自己调试它,这不是什么重大的事情。此外,下次确保您上传的代码确实如您所描述的那样工作。 –

相关问题