1

我目前正在尝试编写一个遍历序列 (x) 的代码,以搜索用户输入的单词。

下面是代码。

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
i = -1
while True:
    s = input("Enter a word to search: ")
    if s != "Quit":
        try:
            while i < len(x):
                i = x.index(s, i+1)
                print("found at index", i)
        except ValueError:
            print("Not found")
        i = -1
    else:
        break
print("Goodbye")

上面的代码在迭代过程中工作正常,但在迭代序列后总是返回 ValueError 。我试图通过添加以下内容来纠正此问题:

while i < len(x):

认为迭代将在到达序列末尾时停止,但在从序列中返回找到的值后继续抛出异常。

例如,如果用户输入“9”,则返回的是:

found at index 8
Not found
4

3 回答 3

4

您正在尝试查找所有事件,但您不会在最后一个事件之后找到下一个事件:

>>> 'abc'.index('a', 0)
0
>>> 'abc'.index('a', 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

您需要设置一个标志来表明您找到了至少一个匹配项,因为对于任意数量的匹配项都会引发异常:

i = -1
try:
    found = False
    while i < len(x):
        i = x.index(s, i+1)
        print("found at index", i)
        found = True
except ValueError:
    if not found:
        print("Not found")

但如果你要扫描整个x列表,只需使用过滤器:

matches = [i for i, value in enumerate(x) if value == s]:
if not matches:
    print('Not found')
for match in matches:
    print("found at index", i)

如果您只需要找到一个匹配项,即第一个匹配项,则根本不需要使用循环:

try: 
    print("found at index", x.index(s))
except ValueError:
    print("not found")

因为那时不需要循环起始位置。

于 2013-04-25T21:05:49.503 回答
0

你总是得到 a 的原因ValueError是因为你总是继续遍历列表中的项目,直到你得到 a ValueError。您需要在内部循环中包含某种条件,while以便在找到元素时退出。更好的是,做我在下面发布的编辑。

而不是这个:

try:
    while i < len(x):
        i = x.index(s, i+1)
        print("found at index", i)
except ValueError:
    print("Not found")
i = -1

试试这个:

try: 
    print("found at index", x.index(s))
except ValueError:
    print("not found")

简单得多。

于 2013-04-25T21:08:11.997 回答
0

如果您想要列表中多次出现的位置,请先获取计数,然后获取出现的索引

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
n = 0
while True:
    s = input("Enter a word to search: ")
    if s != "Quit":
        n = x.count(s)
        if s == 0:
            print('not found')
        else:
            i = -1
            while n > 0:
                print('found at index:', x.index(s,i+1))
                n = n - 1
    else:
        break
print("Goodbye")

尽管可能还有一种更简单的方法。

于 2013-04-25T21:21:31.193 回答