2024-10-03 02:43:25 发布
网友
我试图检查字符串中的两个连续值是否是字符(我预先确定的减去5个运算符)。我试着这么做:
test = "abcdefghijklmnop" bad = "abfj" for i in test: if i in bad and i+1 in bad: print("it works")
运气不好。有没有办法得到循环中字符串的下一个索引?在
谢谢!在
如果您只想检查test的两个连续字符在bad中是否匹配(对哪两个不感兴趣),您可以这样做
test
bad
>>> any("".join([i,j]) in bad for i,j in zip(test,test[1:])) >>> True
如果您希望哪两个字符匹配,哪一个不匹配:
为此,可以使用带有zip的生成器表达式。在
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
实际的索引是。这就是为什么你可以只写i in bad而不是{}。在
i in bad
如果需要索引和字符,请使用enumerate,如下所示:
enumerate
for idx, ch in enumerate(test): if ch in bad and test[idx+1] in bad:
或者两者都使用索引:
另外,请注意,无论采用哪种方法,当到达最后一个字符时,都会出现一个错误,您将尝试检查下一个字符,但没有下一个字符。在
如果您想更抽象地思考,那么th recipes in the ^{} docs中的pairwise函数(或者您可以pip install或者{}或者{};我想他们都有)可以让您在相邻的一对上循环任何。所以:
pairwise
pip install
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]):
你仍然需要处理“最后一个”问题,你会得到一个错误的测试,而不是一个异常,但它仍然是错误的。在
您也可以将其与pairwise结合使用。在
如果您只想检查
test
的两个连续字符在bad
中是否匹配(对哪两个不感兴趣),您可以这样做如果您希望哪两个字符匹配,哪一个不匹配:
^{pr2}$为此,可以使用带有
zip
的生成器表达式。在与列表理解相比,使用生成器表达式的好处是不必迭代整个字符串。在
实际的索引是。这就是为什么你可以只写}。在
i in bad
而不是{如果需要索引和字符,请使用
enumerate
,如下所示:或者两者都使用索引:
^{pr2}$另外,请注意,无论采用哪种方法,当到达最后一个字符时,都会出现一个错误,您将尝试检查下一个字符,但没有下一个字符。在
如果您想更抽象地思考,那么th recipes in the ^{} docs 中的}或者{};我想他们都有)可以让您在相邻的一对上循环任何。所以:
pairwise
函数(或者您可以pip install
或者{或者,如果不太灵活,这可能更容易理解:
如果你理解集合交集的概念,这里还有另一个技巧,可以让你避免不得不做两个单独的测试:
你仍然需要处理“最后一个”问题,你会得到一个错误的测试,而不是一个异常,但它仍然是错误的。在
您也可以将其与
pairwise
结合使用。在相关问题 更多 >
编程相关推荐