如何在字符串中查找字符并获取所有索引?

86

我有一些简单的代码:

def find(str, ch):
    for ltr in str:
        if ltr == ch:
            return str.index(ltr)
find("ooottat", "o")

该函数仅返回第一个索引。如果我将 return 更改为 print,它将打印0 0 0。为什么会这样,有没有方法可以得到 0 1 2


8
请注意,不要将“str”用作变量名,因为它是Python中的现有关键字。 - Silas Ray
3
str 不是关键字,而只是一个内置名称(无法用作变量名的关键字),以上为翻译内容。 - Wooble
5
好的,没问题。这并不改变使用它作为变量名是不好的实践这一事实。 :) - Silas Ray
13个回答

0

为了美化@Lev和@Darkstar发布的五星一行代码:

word = 'Hello'
to_find = 'l'
print(", ".join([str(i) for i, x in enumerate(word) if x == to_find]))

这只是使索引数字更明显地分离。
结果将是:2, 3


0

所有其他答案都有两个主要缺陷:

  1. 它们通过字符串执行Python循环,这非常缓慢,或者
  2. 它们使用numpy,这是一个相当大的附加依赖项。
def findall(haystack, needle):
    idx = -1
    while True:
        idx = haystack.find(needle, idx+1)
        if idx == -1:
            break
        yield idx

这段代码通过迭代字符串 haystack 来查找字符串 needle,始终从上一次迭代的位置开始。它使用内置的 str.find 方法来查找,这比逐个字符地迭代字符串要快得多。它不需要任何新的导入。


这似乎与Hugh Bothwell在2012年的答案相同。链接 - wim
@wim 哇,你说得对。不确定我怎么会错过那个。 - Jonathan

-1
你可以尝试这个。
def find(ch,string1):
    for i in range(len(string1)):
        if ch == string1[i]:
            pos.append(i)        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接