为什么.index只会首先使用重复的单词

时间:2017-02-13 13:07:56

标签: python python-2.7

我一直试图弄清楚这一段时间,我只是想不通为什么我的代码只显示该词的第一次使用。如果有人可以建议一种快速简便的方法,它会显示两者那么非常感谢。

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)

2 个答案:

答案 0 :(得分:1)

index()的设计方式;只返回第一次出现。

如果要查找所有匹配项,则必须在循环或递归中多次调用它。在我们这样做之前,您应该知道您可以提供startend参数来定义在句子中搜索的位置:

>>> "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)

用法(还支持startend参数):

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