我正在尝试使用非常基本的技能来查找python字符串中字符的所有索引号。例如,如果我有字符串“ Apples was awesome”,并且我想找到字符串中“ a”的位置。 我的理想输出是:
0
7
14
19
这些是字符串中所有出现“ a”的位置(我认为)
这是我到目前为止的代码:
sentence = input("Input a string: ")
for ch in sentence:
x = sentence.find('o')
print(x)
在这里我正在寻找'o'而不是a。我的思维过程是,对于字符串中的每个字符,find函数将返回“ o”的位置。由于我不知道输入字符串将需要多长时间,因此我使用了for循环。我能够找到并打印出“ o”的第一个实例,但不是全部。我该怎么办?提前致谢!
答案 0 :(得分:2)
使用enumerate
是标准的做法。不过,对于时间紧迫的操作,您可以利用str.find
的速度。
def find_all(s, c):
idx = s.find(c)
while idx != -1:
yield idx
idx = s.find(c, idx + 1)
print(*find_all('Apples are totally awesome', 'o')) # 12 23
我使上面的返回值生成了一个优雅的生成器,并考虑了非常大的字符串。如果需要的话,当然可以将其强制转换为list
。
这里是使用enumerate
和列表理解的解决方案的基准。两种解决方案都具有线性时间复杂度,但是str.find
的速度明显更快。
import timeit
def find_all_enumerate(s, c):
return [i for i, x in enumerate(s) if c == 'a']
print(
'find_all:',
timeit.timeit("list(find_all('Apples are totally awesome', 'o'))",
setup="from __main__ import find_all")
)
print(
'find_all_enumerate:',
timeit.timeit("find_all_enumerate('Apples are totally awesome', 'o')",
setup="from __main__ import find_all_enumerate")
)
find_all: 1.1554179692960915
find_all_enumerate: 1.9171753468076869
答案 1 :(得分:1)
这是 enumerate 的好地方,它允许我们在循环时获取index and item
,因此,如果我们匹配item
,我们可以拥有相应的{{ 1}},使用index
避免匹配大小写的问题也很有帮助
.lower()
扩展循环:
s = 'Apples are totally awesome'
l = [idx for idx, item in enumerate(s.lower()) if 'o' in item]
l = [] for idx, item in enumerate(s.lower()): if 'o' in item: l.append(idx)
答案 2 :(得分:1)
使用列表理解会带来很大的好处:
[ind for ind, ch in enumerate(sentence) if ch.lower() == 'a']
将返回您想要的所有数字的列表。根据需要打印。
根据您的示例,我假设您不关心大小写,因此调用lower()函数。使用Python 3的星号splat运算符(*),您可以将所有这些作为一个内衬进行;但是我将留给读者练习。
答案 3 :(得分:0)
解决方法是使用find
方法如下
y="Apples are totally awesome"
b=0
for i in range (y.count(o)):
a=y.find('o' , b)
print(a)
b=a+1
#Returns all the positions of o