我正在尝试检查字符串中的2个连续值是否为字符(减去我预先确定的5个运算符)。我试过这样做:
test = "abcdefghijklmnop"
bad = "abfj"
for i in test:
if i in bad and i+1 in bad:
print("it works")
没有运气。无论如何都要在循环中获取字符串的下一个索引吗?
谢谢!
答案 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 install
或toolz
;我认为他们都有它)会让你循环相邻的任何东西。所以:
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")