假设我有一个字符串a
,里面可能是"h.e.l.l.o."
,"h.e...l.l...o."
甚至"h.e..l..o"
。实际上任何一系列的小写字母都可以在那里。(我使用.
作为任何随机字母的占位符,只是为了让它看起来更清晰)
我想遍历字符串,看看字母h
e
l
l
o
(按此顺序)是否存在于该字符串中的任何位置,并将位置返回给我。
下面是我的代码:
import random as r
a = r.choice("hellooooo","hheelllloo","vhweclgljom","hqleeldo","hueqlbo")
" hello h e ll o h e l l o h le l o h e l o"
# notice the first three all have "hello" in order inside the string somewhere, and the last two don't
if "h" in a:
i = a.index("h")
if "e" in a[i:]:
j = a[i:].index("e")
if "l" in a[j:]:
k = a[j:].index("l")
if "l" in a[k:]:
l = a[k:].index("l")
if "o" in a[l:]:
m = a[l:].index("o")
print("found at",i,j,k,l,m)
我并不特别希望在我的代码中出现这样一个疯狂的楼梯。另一种方法是循环通过它,但这要慢得多。有没有其他方法可以有效地做到这一点?
2条答案
按热度按时间efzxgjgh1#
您可以通过将文本转换为迭代器来实现花哨而简洁的效果:
这利用了成员资格测试仅将迭代器向前移动所需的距离(即查找之后的索引)的事实。
而这一点,实际上,确实执行了正确的顺序:
要找到实际的索引,可以使用
str.find(sub[, start[, end]])
:3pmvbmvn2#
循环绝对是一种方法--您只需要在字符串中循环一次(请注意,每次调用
index
都会在字符串中循环一次,因此多次调用index
并不能真正避免循环)。