0

好的,下面是我的问题:

这个程序从一个文件中读取,在不使用 rstrip('\n') 的情况下创建一个列表,我是故意这样做的。从那里,它打印列表,对其进行排序,再次打印,将新的排序列表保存到文本文件中,并允许您在列表中搜索值。

我遇到的问题是:

当我搜索一个名字时,无论我如何输入它,它都会告诉我它不在列表中。

代码一直有效,直到我改变了测试变量的方式。这是搜索功能:

def searchNames(nameList):
    another = 'y'
    while another.lower() == 'y':
        search = input("What name are you looking for? (Use 'Lastname, Firstname', including comma: ")

        if search in nameList:
            print("The name was found at index", nameList.index(search), "in the list.")
            another = input("Check another name? Y for yes, anything else for no: ")
        else:
            print("The name was not found in the list.")
            another = input("Check another name? Y for yes, anything else for no: ")

完整代码,http ://pastebin.com/PMskBtzJ

对于文本文件的内容:http: //pastebin.com/dAhmnXfZ

想法?我觉得我应该注意我已尝试将 ( + '\n') 添加到搜索变量

4

3 回答 3

3

你说你明确没有去掉换行符。

所以,你nameList是一个字符串列表,如['van Rossum, Guido\n', 'Python, Monty\n'].

但是你的search是返回的字符串input,它不会有换行符。所以它不可能匹配列表中的任何字符串。

有几种方法可以解决这个问题。

首先,当然,您可以去掉列表中的换行符。

或者,您可以在搜索过程中动态剥离它们:

if search in (name.rstrip() for name in nameList):

或者您甚至可以将它们添加到search字符串中:

if search+'\n' in nameList:

如果您要进行大量搜索,我会只进行一次剥离并保留剥离名称的列表。


作为旁注,搜索列表以找出名称是否在列表中,然后再次搜索以找到索引,这有点愚蠢。只需搜索一次:

try:
    i = nameList.index(search)
except ValueError:
    print("The name was not found in the list.")
else:
    print("The name was found at index", i, "in the list.")
another = input("Check another name? Y for yes, anything else for no: ")
于 2013-11-12T21:44:29.100 回答
0

此错误的原因是列表中的任何输入都以“\n”结尾。所以例如“约翰,史密斯\ n”。您的搜索功能比使用不包括“\n”的输入。

于 2013-11-12T21:49:13.470 回答
-1

你没有给我们太多继续,但也许使用 sys.stdin.readline() 而不是 input() 会有所帮助?我不相信 2.x input() 会在您的输入末尾留下换行符,这会使“in”运算符永远找不到匹配项。sys.stdin.readline() 确实在最后留下换行符。

与 set_ 中的 'string' 相比, list_ 中的 'string' 也很慢 - 如果您真的不需要索引,则可以使用 set 代替,特别是如果您的集合很大。

于 2013-11-12T21:49:30.260 回答