2014-02-02 2 views
0

Вот обновленная версия из моего предыдущего вопроса here. Я добавляю в код, где, если имя get_close_matches не является именем человека, которого они хотели, отбросьте ближайшее совпадение и заново запустите функцию и возьмите второе ближайшее совпадение (теперь во-первых, поскольку функция будет бросать из первого матча).difflib.get_close_matches выкидывают имена в списке, если первый ответ неверен

Есть ли у вас какие-либо комментарии о том, как это можно написать лучше? И работа. .>>

Вот что я до сих пор:

def throwout(pickedName): 
    employeeNames.remove(pickedName) 
    pickedName = difflib.get_close_matches(userEmpName, employeeNames, 1) 
    print(pickedName) 
    userNameOK = input("Is this the name of the person you're looking for?\n\n Type 'Y' or 'N'.\n\n") 



employeeNames = ['Colton','Jayne','Barb','Carlene','Dick','Despina'] 


employeeNames.sort() 


userEmpName = input("Please enter the employee name you're searching for. We'll return the best match on record.") 


pickedName = difflib.get_close_matches(userEmpName, employeeNames, 1) 
print(pickedName) 


userNameOK = input("Is this the name of the person you're looking for?\n\n Type 'Y' or 'N'.\n\n") 


if userNameOK == "N" or "n": 
    if pickedName in employeeNames: 
     throwout(pickedName) 
    else: 
     break 
else: 
    break 

Ошибка для запуска из имен в списке:

Traceback (most recent call last): 
    File "C:/Python33/employee1.py", line 64, in <module> 
    print(userAnswer + " is the right choice.\n") 
NameError: global name 'userAnswer' is not defined 

Я понимаю, что означает, что, поскольку список имен имеет больше нет имен от их удаления, тогда глобальная переменная «userAnswer» не определена.

ответ

0

Нет необходимости создавать функцию для извлечения имен из списка, так как list.remove(name) делает то же самое в одной строке.

import difflib 

employeeNames = ['Colton','Coltron','Colty','Jayne','Barb','Carlene','Dick','Despina'] 
employeeNames.sort() 
userEmpName = raw_input("Please enter the employee name you're searching for. We'll return the best match on record.") 

while True: 
    global Answer 
    pickedName = difflib.get_close_matches(userEmpName, employeeNames, 1) 

    print(pickedName) 
    print employeeNames 

    if len(pickedName)==0: 
     break 

    userNameOK = raw_input("Is this the name of the person you're looking for?\n\n Type 'Y' or 'N'.\n\n") 

    if (userNameOK=='n' or userNameOK=='N'): 
     employeeNames.remove(pickedName[0]) 

    else: 
     Answer=pickedName[0] 
     break 

print Answer+" is the right choice" 

Однако с помощью глобальной переменной, как правило, плохая практика, так что вы можете сделать функцию, чтобы сделать все это дело и вернуть правильный Answer

Кроме того, как employeeNames изменяется каждый раз, когда имя удаляется из него следует лучше создать копию списка и работать над этим конкретным списком

+0

С небольшим количеством фальсификации для моего редактора IDLE я получил его, чтобы он работал неплохо. Как бы выглядела функция (иначе, чем та, которую я положил)? И наконец; как вы собираетесь поддерживать список удаления? Не похоже, что это будет очень полезно для этой конкретной программы, поскольку она не предназначена для повторного запуска, если выбранное имя не является именем, которое пользователь хочет. Спасибо за помощь, тоже. Это очень ценится. – user3259628

+0

Вы можете создать функцию, позволяющую сказать 'nameLookUp (employeeNames)' и добавить весь код после строки 'employeeNames.sort()' к нему ..... аргумент функции является списком 'employeeNames' – adil

+0

Да вы правы для этой программы, это не полезно, но я просто думал, что если это всего лишь часть более крупного проекта, где список может понадобиться снова. Для этого вы создаете копию и передаете ее функции 'nameLookUp()' ....... 'newList = oldList [:]' это то, как вы копируете список. – adil

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

  • Нет связанных вопросов^_^