在字符串中查找字符的所有位置

时间:2018-09-22 02:12:12

标签: python for-loop

我正在尝试使用非常基本的技能来查找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”的第一个实例,但不是全部。我该怎么办?提前致谢!

4 个答案:

答案 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