我目前正在尝试编写一个迭代序列(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
答案 0 :(得分: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")
因为没有必要在起始位置上循环。
答案 1 :(得分:0)
您始终获得ValueError
的原因是因为您始终会继续遍历列表中的项目,直到获得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")
更简单。
答案 2 :(得分: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")
虽然可能还有一种更简单的方法。