2016-04-28 5 views
0

(Я новичок в Python и программировании) Я использую raw_input(), поэтому я могу сделать программу, которая разговаривает с пользователем. Например:Python: Если Raw_Input содержит ... BLAH

Программа: Как дела? Пользователь: Я отлично себя чувствую/Я чувствую себя ужасно.

Мне нужна моя программа для ответа соответственно, как в "YAY!" или «Ой человек ... Надеюсь, тебе скоро станет лучше». так что вы можете дать мне способы сканирования слов, таких как «хороший» или «плохой» в исходном входе пользователя, поэтому моя программа знает, как реагировать?

Я знаю несколько способов сделать это, но проблема в том, что я хочу несколько слов для поиска, таких как великие, удивительные и удивительные, которые можно отнести к «хорошей» группе. И, мне нужно, где это не должно быть точным. Я продолжаю сталкиваться с проблемами, когда пользователь должен точно напечатать: «Я хорош». а не все различные варианты, которые они могли бы сказать об этом. ЗАРАНЕЕ СПАСИБО!

ответ

0

Ну, я не уверен, что программа понимает английский язык. Он будет принимать строковый литерал как строковый литерал. «Хорошее» не означает «Хорошее» или «плохое» для переводчика в Python.

Что я предлагаю сделать с помощью словаря всех хороших фраз, например, я хорош, Feelin 'отлично, я ОК. Вы можете хранить все эти литературные строки хорошего качества в своем словаре «Good Feels», и наоборот, ваши плохие чувствуют строковые литералы.

Я не слишком уверен, как вы бы работать вокруг орфографии с < точностью 100% и интерпретатором еще поднять его

Я немного неопытных себя, но я бы сказал, предопределенный словарь ваш лучший выбор, возможно, выкиньте оператор else, который подскажет пользователю правильно произнести заклинание, если он не сможет получить право голоса.

2

Возможно, вы найдете здесь set.

sentence = "I feel great" 
words = sentence.split(" ") 
if set("good", "fine", "great").intersects(words): 
    print("user is good!") 
if set("bad", "poorly", "sick").intersects(words): 
    print("user is bad") 

set представляет собой особый тип контейнера, как list или dict. Он игнорирует повторяющиеся записи, но очень быстро проверяет, существует ли элемент. set.intersects возвращает новый set который содержит только пункты, найденные с обеих сторон: так, в первом заявлении if, он возвращает set("great"), что является «правдивым» (ведет себя как True в булевом контексте). Второе, если оператор получает пустое множество, которое является «falsey»

Вы можете очистить его с помощью словаря (но вы должны сделать небольшое изменение, я объясню ниже)

responses = {frozenset("good", "fine", "great"): "that's fantastic", 
      frozenset("bad", "poorly", "sick"): "I hope you feel better!"} 

words = sentence.split(" ") 
for wordset, reply in responses: 
    if(wordset.intersects(words): 
     print(reply) 

изменения мы вынуждены были использовать frozenset, а не set. Единственное реальное различие, о котором вам нужно беспокоиться, заключается в том, что frozenset - это неизменный, что означает, что вы не можете добавлять или удалять его членов. По причинам, связанным с осуществлением, dictключи должны быть неизменны: вы не можете использовать dict, list или set в качестве ключа: но вы можете использовать tuple, int, str и т.д.

Вы можете получить точно такое же поведение без использования set: это займет всего пару несколько строк:

responses = {("good", "fine", "great"): "that's fantastic", 
      ("bad", "poorly", "sick"): "I hope you feel better!"} 

words = sentence.split(" ") 
for wordtuple, reply in responses: 
    for word in words: 
     if word in wordtuple: 
      print(reply) 
      break 

Таким образом, нам нужно еще две линии, и в конечном итоге делает гораздо больше контроля, чем мы на самом деле нужно к. Если есть много возможных слов, чтобы проверить, что может замедлить вашу программу. Это не всегда так плохо, например, вы можете получить responses, что означает, что вы не будете контролировать эти типы, но если вы знаете, что пишете весь свой собственный код, это хорошо сделать вещи пифонически с самого начала.

+0

Я бы предпочел сделать это с помощью простых '' x '' в ['x', 'y', 'z'] 'вместо того, чтобы вводить разные типы данных, новому программисту, но, тем не менее, хорошее объяснение – taesu

+1

@taesu I верьте в учение, чтобы сделать это * правильно *, а не делать это легко. И 'set' является общим (и полезным) достаточно, чтобы он был встроенным. – RoadieRich

+0

Обучение легко не нужно * неправильный *. Я уверен, что новые программисты будут перегружены всеми этими типами, которые вы бросаете на них. – taesu

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