Python在for循环中跳过一些行

时间:2014-12-13 21:56:16

标签: python loops

我有一个我写的脚本,并且有一个应该用这种布局搜索字典的功能:

{
    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()

1 个答案:

答案 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中要求的,但是......
如果在同一组中有多个人输入的名/姓,会发生什么?正如我所看到的,看起来脚本只会让用户选择第一个匹配的索引,如果用户说这不是相关学生,则脚本开始查看下一个组而不是在同一组中返回下一个索引。