Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中优化列表搜索中冲突的多个条件?_Python_List_Search_Conditional Statements - Fatal编程技术网

如何在python中优化列表搜索中冲突的多个条件?

如何在python中优化列表搜索中冲突的多个条件?,python,list,search,conditional-statements,Python,List,Search,Conditional Statements,我正在用python制作一个电话簿搜索程序,在一个文本文件中搜索学校的名字输入。在程序中,要求用户输入姓氏或名和姓。然后,该程序将搜索文本文件并打印与输入的电话号码相匹配的姓名。 因此,如果用户输入Adams,结果将是: 约翰·亚当斯,508-555-5555 奎西亚当斯,508-555-5556 如果用户输入John Adams,则只会打印他的名字 约翰·亚当斯,508-555-5555 我的问题是for循环的条件是逐行读取列表。它将打印与姓氏匹配的所有姓名,无论是否使用全名。 以下是我的代码

我正在用python制作一个电话簿搜索程序,在一个文本文件中搜索学校的名字输入。在程序中,要求用户输入姓氏或名和姓。然后,该程序将搜索文本文件并打印与输入的电话号码相匹配的姓名。

因此,如果用户输入Adams,结果将是:
约翰·亚当斯,508-555-5555
奎西亚当斯,508-555-5556

如果用户输入John Adams,则只会打印他的名字
约翰·亚当斯,508-555-5555

我的问题是for循环的条件是逐行读取列表。它将打印与姓氏匹配的所有姓名,无论是否使用全名。
以下是我的代码:

while True:
    original_name = input("Enter a last name, or first and last name: ")  # prompt user for name

    if original_name == "":   # create condition for infinite loop to end
        break

    l_name = original_name.lower()  # lower case to assist in finding a match
    s_name = l_name.split()         # split to allow a full name to become two variables

    if len(s_name) == 1:        # Set condition for last name if it is by itself to be properly placed in variable
        last_name = s_name[0]
    elif len(s_name) == 2:      # Set condition for first name and last name to go into proper variables
        first_name = s_name[0]
        last_name = s_name[1]
    else:
        print("Error: Input needs to be no more than 2 names!")  # error for when more than 2 names are given

    f = open("phones.txt", 'r')     # open text file being used
    numbers = f.readlines()         # read text file line by line

    for line in numbers:
        line = line.lower()     # lower case to assist in finding a match
        line = line.strip()     # strip to get rid of new lines
        line = line.split()     # split to allow for both first and last name to match

        if line[1] == last_name in line:    # This condition is to ensure a line is printed if only a last name is used
            print(line[0].capitalize(), line[1].capitalize(), ",", line[2])
        elif line[1] == last_name and line[0] == first_name in line: # when a first and last name is used
            print(line[0].capitalize(), line[1].capitalize(), ",", line[2])
        else:       
            continue

我知道我的问题在于条件句。如果我首先使用elif条件,即使使用全名,它也会打印具有相同姓氏的姓名
我已经研究了stackflow上的几个问题,看看是否可以解决,但没有一个完全符合我的问题。此外,我想知道如何使逗号更接近姓氏,因为我的输出将其在姓氏前加一个空格:John Adams,508-555-5555
我感谢所有提供的帮助,并期待您传授知识

你想要的东西大致如下:

if (len(s_name) == 2 and first_name == line[0] and last_name == line[1]) or (len(s_name) == 1 and last_name == line[1]):
    print(line[0].capitalize(), line[1].capitalize(), ",", line[2])

如果提供了两个名称且两个名称匹配,或者如果提供了一个名称且与姓氏匹配,则打印该行。值得注意的是,对于行lsit中的每个元素,您可能需要执行strip as,以避免由于空格而导致元素不匹配。

您需要以下内容:

if (len(s_name) == 2 and first_name == line[0] and last_name == line[1]) or (len(s_name) == 1 and last_name == line[1]):
    print(line[0].capitalize(), line[1].capitalize(), ",", line[2])

如果提供了两个名称且两个名称匹配,或者如果提供了一个名称且与姓氏匹配,则打印该行。值得注意的是,对于行lsit中的每个元素,您可能希望执行strip as,以避免由于空格而导致元素snot匹配。

为什么还要麻烦获取姓氏和名字?试试这个:

while True:
    if input("name").lower() in line.lower():
        print(line)
编辑


为什么要麻烦得连姓和名都要问呢?试试这个:

while True:
    if input("name").lower() in line.lower():
        print(line)
编辑


您是否曾经尝试过一次读取列表,然后将其转换为可以在内存中使用的python对象(如dict或其他东西)?其中一些测试没有多大意义。例如,
第[1]行==第
行中的姓氏。这相当于
行[1]==行中的姓氏和姓氏
,而这又相当于
行[1]==姓氏
。如果满足第一个条件,那么它在
行中的附加测试是没有意义的。@TomKarzes啊,我不知道该语句中的逻辑。我将在以后的条件语句中记住它。您是否曾经尝试过一次读取列表,然后将其转换为可以在内存中使用的python对象(如dict或其他东西)?其中一些测试没有多大意义。例如,
第[1]行==第
行中的姓氏。这相当于
行[1]==行中的姓氏和姓氏
,而这又相当于
行[1]==姓氏
。如果满足第一个条件,那么它在
行中的附加测试是没有意义的。@TomKarzes啊,我不知道该语句中的逻辑。我会记住这一点,为我未来的条件。谢谢你卡洛斯!我实施了你的条件,效果非常好。我仍然对印刷品中的逗号有异议,但这并不是世界末日。再次感谢你!谢谢你,卡洛斯!我实施了你的条件,效果非常好。我仍然对印刷品中的逗号有异议,但这并不是世界末日。再次感谢你!我看到的问题是,它无法满足我要求的格式要求。由于文本文件的姓氏后没有逗号,我必须将其添加到程序中。因此数据为:abc def xxxxxxxxx??是。所以:约翰·亚当斯508-555-5555检查这个新编辑。如果这是问题的答案,请记住接受它作为解决方案。我看到的问题是,它无法满足我要求的格式要求。由于文本文件的姓氏后没有逗号,我必须将其添加到程序中。因此数据为:abc def xxxxxxxxx??是。所以:约翰·亚当斯508-555-5555检查这个新编辑。如果这是问题的答案,记得接受它作为解决方案。