我一直试图弄清楚这一段时间,我只是想不通为什么我的代码只显示该词的第一次使用。如果有人可以建议一种快速简便的方法,它会显示两者那么非常感谢。
sentence = input("please insert a sentence").lower()
keyword = input ("please insert a keyword you would like to search for")
splitsentence = sentence.split(" ")
position = sentence.index(keyword)
if keyword in sentence:
print(position)
答案 0 :(得分:1)
index()
的设计方式;只返回第一次出现。
如果要查找所有匹配项,则必须在循环或递归中多次调用它。在我们这样做之前,您应该知道您可以提供start
和end
参数来定义在句子中搜索的位置:
>>> "cat cat".index("cat")
0
>>> "cat cat".index("cat", 1) # start search from index 1
4
>>> "cat cat".index("cat", 1, 4) # ...and stop search right before index 4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
这样我们就可以避免在循环中始终获得相同的索引:
s = "cat cat"
indexes = []
index = -1
while True:
try:
index = s.index("cat", index + 1)
except ValueError:
break
indexes.append(index)
print(indexes)
# Output: [0, 4]
如果你想要花哨的话,这里是一个递归的发生器:
def find_indices(s, sub, start=0, end=None):
if end is None:
end = len(s)
try:
start = s.index(sub, start, end)
except ValueError:
return
yield start
yield from find_all_indexes(s, sub, start + 1, end)
用法(还支持start
和end
参数):
>>> list(find_indices("cat cat cat cat", "cat"))
[0, 4, 8, 12]
或者如果你想要一个非递归生成器,你可以使用原始的while
循环并让它yield
而不是附加到列表中:
def find_indices(s, sub, start=0, end=None):
if end is None:
end = len(s)
start -= 1
while True:
try:
start = s.index(sub, start + 1, end)
except ValueError:
break
yield start
与以前完全相同的用法。
答案 1 :(得分:0)
因为这是定义.index
的方式:documentation说:
<强>
str.index(sub[, start[, end]])
强>像
find()
, 但是在找不到子字符串时会引发ValueError
。
和.find
:
<强>
str.find(sub[, start[, end]])
强>在找到substring sub的字符串中返回最低索引 在切片
s[start:end]
内。可选参数start和end是 解释为切片表示法。如果找不到sub,则返回-1
。
(突出显示已添加)
查找所有索引的想法是使用:
[i for i in range(len(sentence)) if keyword == sentence[i:i+len(keyword)]]
或者更高效:生成索引的生成器:
def find_indices(sentence,keyword):
idx = -1
while True:
idx = sentence.find(keyword,idx+1)
if idx < 0:
break
yield idx