2013-11-12 2 views
0

Итак, ниже мой вопрос:Python не читает из списка corretly

эта программа считывает из файла, составляет список без использования rstrip («\ п»), который я сделал нарочно. Оттуда он распечатывает список, сортирует его, распечатывает его снова, сохраняет новый, отсортированный список в текстовый файл и позволяет вам искать в списке значение.

Проблемы я имею это:

при поиске имени, независимо от того, как я ввожу его, он говорит мне, что его нет в списке.

код работал, пока я не изменил способ тестирования переменной. Вот функция поиска:

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') к переменной поиска

+0

Интуиция ... потраченные итераторы? – DeaconDesperado

ответ

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: ") 
+0

Lol Guido van Rossum – wvdz

+0

lol. Нашел проблему. Я добавил + '\ n' в неправильном месте, когда я попробовал это. Теперь я заработал. – user2962806

+0

@ user2962806: Есть причина, по которой я отвечаю последним из трех. Он будет работать, но я думаю, что будет намного чище иметь 'nameList' список имен, чем список строк, содержащих как имена, так и символы новой строки. – abarnert

0

Причина этой ошибки заключается в том, что любой ввод в вашем списке заканчивается знаком «\ n». Например, «john, smith \ n». Функция поиска, чем использует вход, который НЕ включает «\ n».

-1

Вы не дали нам многого для продолжения, но, возможно, использование sys.stdin.readline() вместо input() поможет? Я не верю, что вход 2.x() будет оставить новую строку в конце ваших входов, что заставит оператора «in» никогда не найти совпадение. sys.stdin.readline() оставляет в конце новую строку.

Кроме того, 'string' в list_ медленнее по сравнению с 'string' в set_ - если вам действительно не нужны индексы, вы можете использовать набор вместо этого, особенно если ваша коллекция большая.

+0

Он почти наверняка использует 3.x здесь, а не 2.x. (По крайней мере, он явно _thinks_ он использует 3.x.) – abarnert

+0

В любом случае, если он _were_ использовал 2.x, у него была бы гораздо большая проблема: набрав 'Python, Monty', вы просто дадите' NameError: 'Python' не определено'. – abarnert

Смежные вопросы