我有一个我写的脚本,并且有一个应该用这种布局搜索字典的功能:
{
1 : ['name1','name2','name3','name4','name5'],
2 : ['name1','name2','name3','name4','name5']
}
一个字。这是功能:
def find_student(list_curr):
''' (str, dict) -> list
Input is the student's name and the dictionary of lists that they should exist in; output is a list in the format:
[group,index]
'''
while True:
try:
stu_name = input("\nPlease enter the first or last name of the student, or press enter to exit:\n> ")
if not stu_name:
return False
else:
break
except ValueError:
print("Please enter a valid name")
for g,s in list_curr.items():
print("G",g)
print("S",s)
if any(stu_name in n for n in s):
# name was in group
print("\nFound a possible match: {} (group {}):".format(s[s.index(stu_name)],g))
pp.pprint(s)
if input("\nIs this the student you're looking for?\n> ") in "yesYES":
# found the correct student
print("Saving {} for group and {} for index.".format(g,s.index(stu_name)))
stu_info = [g,s.index(stu_name)]
return stu_info
# nothing was found
print("\n{} was not found in the list.".format(stu_name))
return False
但是当我运行它时,它会在找到匹配后立即中断。 if any():
部分以下的所有内容都没有运行,只是在没有打印Found a possible match...
行的情况下返回。我曾尝试在IDLE中使用调试器,但每当我打开它时它都会不断崩溃。我看过其他帖子与此非常相似,但不知道我哪里出错了。有什么想法吗?
编辑:抱歉,for any()
已if any()
。
答案 0 :(得分:1)
您可能在
上遇到了ValueError if any(stu_name in n for n in s):
# name was in group
print("\nFound a possible match: {} (group {}):".format(s[s.index(stu_name)],g))
any(s中n中的stu_name)检查stu_name是否作为列表s中字符串的子字符串出现。
s.index(stu_name)但是会尝试查找stu_name与s中元素之间完全匹配的索引。 尝试替换示例值以查看正在进行的操作:
s = ['James Joyce', 'Tom Stoppard', 'William Shakespeare']
stu_name = 'William'
print(any(stu_name in name for name in s))
print(s.index(stu_name))
不确定为什么你没有看到异常,也许你的代码中的其他地方有一个裸露的Except子句? 如果上述问题是您的问题,可以在find_student中编写这样的内联函数:
def get_index(stu_name, names):
for index, name in enumerate(names):
if stu_name in name:
return index
并调用 get_index(stu_name,s)而不是 s.index(stu_names)。
或者,您可能只想编辑代码,以便只接受完全匹配。 在这种情况下,
if any(stu_name in name for name in s):
变为
if stu_name in s:
用户需要进入威廉·莎士比亚"而不只是"威廉"。
P.S。这不是op中要求的,但是......
如果在同一组中有多个人输入的名/姓,会发生什么?正如我所看到的,看起来脚本只会让用户选择第一个匹配的索引,如果用户说这不是相关学生,则脚本开始查看下一个组而不是在同一组中返回下一个索引。