如何在python中优化列表搜索中冲突的多个条件?
我正在用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循环的条件是逐行读取列表。它将打印与姓氏匹配的所有姓名,无论是否使用全名。 以下是我的代码
因此,如果用户输入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检查这个新编辑。如果这是问题的答案,记得接受它作为解决方案。