如何检查字符串中的2个连续值是否是另一个字符串中的字符

时间:2018-03-15 01:53:17

标签: python python-2.7

我正在尝试检查字符串中的2个连续值是否为字符(减去我预先确定的5个运算符)。我试过这样做:

test = "abcdefghijklmnop"

bad = "abfj"

for i in test:
    if i in bad and i+1 in bad:
        print("it works")
没有运气。无论如何都要在循环中获取字符串的下一个索引吗?

谢谢!

5 个答案:

答案 0 :(得分:1)

document.getElementById('code-textarea').value.replace('-', '–'); 不是索引,它是实际的字符。这就是为什么你只能写i而不是i in bad

如果您想要索引以及字符,请使用test[i] in bad,如下所示:

enumerate

或者只使用两者的索引:

for idx, ch in enumerate(test):
    if ch in bad and test[idx+1] in bad:

另外,请注意,无论您采用哪种方式,当您到达最后一个角色时,您都会遇到错误 - 您将尝试检查下一个角色,但没有下一个角色。

如果你想更抽象地思考th recipes in the itertools docs中的for idx in range(len(test)): if test[idx] in bad and test[idx+1] in bad: 函数(或者pairwise pip installtoolz;我认为他们都有它)会让你循环相邻的任何东西。所以:

more-itertools

或者这可能更容易理解,如果不太灵活:

for current_char, next_char in pairwise(test):
    if current_char in bad and next_char in bad:

如果你理解了集合交叉的想法,这里的另一个技巧可以让你避免做两个单独的测试:

for current_char, next_char in zip(test, test[1:]):
    if current_char in bad and next_char in bad:

你还需要处理"最后一个"问题 - 你会得到一个不正确的测试而不是例外,但它仍然是错误的。

您也可以将其与bad = set(bad) for idx in range(len(test)): if bad.intersection(test[idx:idx+2]):

结合使用

答案 1 :(得分:1)

如果您只是想检查test中的两个连续字符是否与bad匹配(对哪两个不感兴趣)

>>> any("".join([i,j]) in bad for i,j in zip(test,test[1:]))
>>> True

如果您想要哪两个字符匹配,哪些字符不匹配

>>> [("".join([i,j]) in bad,"".join([i,j])) for i,j in zip(test,test[1:])]
>>> [(True, 'ab'), (False, 'bc'), (False, 'cd'), (False, 'de'), (False, 'ef'), (False, 'fg'), (False, 'gh'), (False, 'hi'), (False, 'ij'), (False, 'jk'), (False, 'kl'), (False, 'lm'), (False, 'mn'), (False, 'no'), (False, 'op')]

答案 2 :(得分:0)

您可以使用带有zip的生成器表达式。

使用生成器表达式与列表推导的好处是您不必迭代整个字符串。

test = "abcdefghijklmnop"
bad = "abfj"
bad_set = set(bad)

res = ((i in bad_set) and (j in bad_set) for i, j in zip(test, test[1:]))

for k in res:
    if k:
        print(k)
        break

# True

答案 3 :(得分:0)

在一行中使用范围方法:

test = "abcdefghijklmnop"

bad = "abfj"


print([("true",test[i:i+2]) for i in range(0,len(test),1) if test[i:i+2] in bad])

使用递归方法:

test = "abcdefghijklmnop"

bad = "abfj"


def recursive_approach(test1):
    print(test1)
    if not test1:
        return 0
    else:
        if test1[:2] in bad:
            print('True', test1[:2])
        return recursive_approach(test1[1:])
print(recursive_approach(test))

答案 4 :(得分:-1)

该循环中的i是一个字符串,因此您不能将其用作索引 将此部分代码更改为:

for i in range(0,len(test)):
    while(i+1<len(test)):
         if test[i] in bad and test[i+1] in bad:
            print("it works")