如何在字符串中查找字符并获取所有索引?
- 2025-03-04 08:25:00
- admin 原创
- 66
问题描述:
我得到了一些简单的代码:
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
?
解决方案 1:
这是因为将返回第一次出现的str.index(ch)
索引。尝试:ch
def find(s, ch):
return [i for i, ltr in enumerate(s) if ltr == ch]
这将返回您需要的所有索引的列表。
PS Hugh 的回答展示了一个生成器函数(如果索引列表很大,情况就会有所不同)。 也可以通过更改[]
为 来调整此功能()
。
解决方案 2:
我会选择 Lev,但值得指出的是,如果您最终进行更复杂的搜索,使用 re.finditer 可能值得考虑(但 re 通常会带来比价值更多的麻烦 - 但有时知道会很方便)
test = "ooottat"
[ (i.start(), i.end()) for i in re.finditer('o', test)]
# [(0, 1), (1, 2), (2, 3)]
[ (i.start(), i.end()) for i in re.finditer('o+', test)]
# [(0, 3)]
解决方案 3:
我会使用Lev 的答案,但是这里有一些基于原始代码的内容:
def find(str, ch):
for i, ltr in enumerate(str):
if ltr == ch:
yield i
>>> list(find("ooottat", "o"))
[0, 1, 2]
解决方案 4:
def find_offsets(haystack, needle):
"""
Find the start of all (possibly-overlapping) instances of needle in haystack
"""
offs = -1
while True:
offs = haystack.find(needle, offs+1)
if offs == -1:
break
else:
yield offs
for offs in find_offsets("ooottat", "o"):
print offs
结果是
0
1
2
解决方案 5:
def find_idx(str, ch):
yield [i for i, c in enumerate(str) if c == ch]
for idx in find_idx('babak karchini is a beginner in python ', 'i'):
print(idx)
输出:
[11, 13, 15, 23, 29]
解决方案 6:
一行代码即可获取所有位置信息
word = 'Hello'
to_find = 'l'
# in one line
print([i for i, x in enumerate(word) if x == to_find])
解决方案 7:
根据经验,在使用 POD(普通旧数据)时,NumPy 数组通常优于其他解决方案。字符串是 POD 的一个例子,也是字符的例子。要查找字符串中只有一个字符的所有索引,NumPy ndarrays 可能是最快的方法:
def find1(str, ch):
# 0.100 seconds for 1MB str
npbuf = np.frombuffer(str, dtype=np.uint8) # Reinterpret str as a char buffer
return np.where(npbuf == ord(ch)) # Find indices with numpy
def find2(str, ch):
# 0.920 seconds for 1MB str
return [i for i, c in enumerate(str) if c == ch] # Find indices with python
解决方案 8:
我认为这是最简单的方法:
def find(ch, string1):
return [i for i in range(len(string1)) if string1[i]==ch]
无需外部库,只需简单的 python =)
解决方案 9:
x = "abcdabcdabcd"
print(x)
l = -1
while True:
l = x.find("a", l+1)
if l == -1:
break
print(l)
解决方案 10:
这是Mark Ransom答案的稍微修改后的版本,如果ch
长度可以超过一个字符,它就可以起作用。
def find(term, ch):
"""Find all places with ch in str
"""
for i in range(len(term)):
if term[i:i + len(ch)] == ch:
yield i
解决方案 11:
所有其他答案都有两个主要缺陷:
它们对字符串进行 Python 循环,速度非常慢,或者
他们使用 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
这比逐个字符迭代要快得多haystack
。它不需要任何新的导入。
解决方案 12:
为了修饰@Lev 和@Darkstar 发布的五星级俏皮话:
word = 'Hello'
to_find = 'l'
print(", ".join([str(i) for i, x in enumerate(word) if x == to_find]))
这只是使索引号的分离更加明显。
结果将是: 2, 3
解决方案 13:
你可以试试这个
def find(ch,string1):
for i in range(len(string1)):
if ch == string1[i]:
pos.append(i)
扫码咨询,免费领取项目管理大礼包!