Как удалить переменные из списка в методе? - PullRequest
0 голосов
/ 04 марта 2020

Я довольно новичок в Python, и мне было интересно, как решить проблему. Я работаю над текстовым тестом, который выявляет симптомы и определяет, от какой болезни вы можете страдать. Я сделал несколько списков, содержащих симптомы. Затем я разработал метод для каждой болезни (повторяющийся, я знаю), чтобы просмотреть симптомы и проверить, соответствует ли введенный пользователем ввод. Если это не так, я хочу удалить симптом из списка возможных заболеваний. Но, видите, код может определить, совпадают ли симптомы для первого вопроса, но программа все еще ищет болезнь в списке возможностей даже после того, как она была удалена. Я пытался использовать булевы переменные, чтобы остановить цикл программы, если болезни нет в списке возможных. Я пытался использовать for-l oop с возможным списком. Моя последняя попытка превратить ранее логические переменные в строки и проверить их таким образом. Как я уже сказал, я довольно новичок в Python, поэтому извините, если это простая ошибка. Если вы можете помочь, пожалуйста, сделайте! Этот проект должен быть в пятницу. Большое вам спасибо!

Вот код (извините, если он слишком длинный. Впервые на Python - новинка на сайте!):

possibles = [ "InfluenzaA", "InfluenzaB", "InfluenzaC", "CommonCold", "Pneumonia", "StrepThroat", "b", "n", "Croup", "EnterovirusD68", "h", "Herpangina", "PinkEye", "Pertussis"]

InfluenzaA = ["Cough", "Runny nose" "Stuffy nose", "Sneezing", "Sorethroat", "Fever", "Headache", "Bodychills", "Fatigue", "Body aches"]

CommonCold = ["Cough", "Runny nose" "Stuffy nose", "Sneezing", "Sorethroat", "Fever", "Headache", "Bodychills", "Fatigue", "Body aches"]

InfluenzaB = ["Cough", "Stuffy nose", "Sore throat", "Fever", "Headache", "Body chills", "Fatigue", "Muscle aches", "Nausea", "Vomiting"]

InfluenzaC = ["Cough", "Rhinorrhea", "Fever", "Headache", "Muscle pain" ]

CommonCold = ["Cough", "Runny nose", "Stuffy nose", "Congestion", "Sneezing","Sore throat", "Fever", "Headache", "Malaise"]

Pneumonia = ["Cough", "Chest pain", "Fever", "Fatigue", "Loss of appetite", "Body pain", "Shortness of breath", "Fast heartbeat"]

StrepThroat = ["Fever", "Headache", "Throat pain", "Loss of appetite", "Nausea", "Vomiting", "White dots", "Red dots", "Inability or diffuculty swallowing"]

Bronchiolitis = ["Cough", "Runny nose", "Stuffy nose", "Fever", "Shortness of breath", "Wheezing", "Ear pain", "Loss of fluids"]

Norovirus = ["Fever", "Abdominal pain", "Malaise", "Muscle pain", "Diarrhea", "Nausea", "Vomiting"]

Croup = ["Cough", "Runny nose", "Stuffy nose", "Shortness of breath", "Wheezing", "Sore throat", "Fever", "Throat pain", "Fatigue"]

EnterovirusD68 = ["Cough", "Runny nose", "Stuffy nose", "Sneezing", "Wheezing", "Fever", "Body aches"]

HandFootandMouthDisease = ["Sore throat", "Fever", "Headache", "Fatigue","Rash", "Drooling"]

Herpangina = ["Sore throat", "Fever", "Headache", "Fatigue", "Loss of appetite", "Inabilty or diffuculty swallowing", "Mouth blisters or ulcers", "Drooling", "Vomiting"]

PinkEye = ["Red eye", "Eye discharge", "Blurred vision", "Light sensitivity"]

Pertussis = ["Cough", "Runny nose", "Stuffy nose", "Fever", "Fatigue", "Vomiting", "Mucus in the throat"]

stinA = "yes"

stinBe = "yes"

stinC = "yes"

stinPer = "yes"

stinHM = "yes"

stinH = "yes"

stinE = "yes"

stinN = "yes"

stinPE = "yes"

stinCr = "yes"

stinCC = "yes"

stinST = "yes"

def cycleInfluenzaA(sy, stinA):

     for i in range(len(InfluenzaA)):

          if InfluenzaA[i].upper() == sy.upper():

                    return

     possibles.remove("InfluenzaA")

     stinA = "no"

(Остальные тот же формат)

def ask(bod, stinCC, stinCr, stinE, stinA, stinC, stinBe, stinH, stinN, stinPer, stinPE):

  sy = input("Have you experienced any symptoms relation to your " + bod + "\n")

     if stinCC == "yes":

         cycleCold(sy, stinCC)

(остальные в том же формате)

print("Welcome to this medical database. This is an interactive test to determine what illness a taker may be suffering from. Let's begin.")

ask("chest", stinCC, stinCr, stinE, stinA, stinC, stinBe, stinH, stinN, stinPer, stinPE)

ask("throat", stinCC, stinCr, stinE, stinA, stinC, stinBe, stinH, stinN, stinPer, stinPE)

Вот ошибка:

Traceback (последний вызов был последним) : Файл "main.py", строка 150, в

ask ("горло", stin CC, stinCr, stinE, stinA, stin C, stinBe, stinH, stinN, stinPer, stinPE)

Файл "main.py", строка 140, в запросе

cycleHerpangina (sy, stinH)

Файл "main.py", строка 100, в циклеHerpangina

возможных .remove ("Herpangina")

ValueError: list.remove (x): x отсутствует в списке

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Если вы хотите собрать «да» и «нет» для одного пациента, они ответят, есть ли у них симптом или нет. И ведите учет по каждому заболеванию, вы можете l oop по словарю / симптому болезни (symptom_dict) вот так.

>>> def interview_patient(patient):
...     for disease in symptom_dict['possibles']:
...         try:
...             for symptom in symptom_dict[disease]:
...                 # answer will be either "yes" or "no".
...                 answer = ask(patient, disease, symptom)
...                 try:
...                     # The patient dict has keys for "yes" and "no".
...                     patient[disease][answer]  += 1
...                     patient[disease]['total'] += 1
...                 except KeyError:
...                     # If the patient didn't have "yes" and "no" keys, 
...                     # create them.
...                     patient[disease] = {'yes': 0, 'no': 0, 'total': 1}
...                     patient[disease][answer]  += 1
...         except KeyError as ke:
...             print(f"There was an error accessing a symptom_dict key: {ke}")
...     return patient
...   

У вас может быть функция для создания пациента, у которого может быть заболевание и назначить случайное заболевание его свойству «правдоподобия».

>>> def get_patient():
...     return { 'likelihood': random.choice(symptom_dict['possibles']) }
...   

Чтобы смоделировать сценарий и провести тестирование, мы могли бы иметь простую функцию, которая отвечает на такие вопросы, как пациент:

>>> def ask(patient, disease ,symptom):
...     if patient['likelihood'] == disease:
...         answer = random.choices(['yes', 'no'], [25, 5])[0]
...     else:
...         answer = random.choices(['yes', 'no'], [5, 25])[0]
...     print('have you experienced %-35s %s' % (symptom, answer))
...     return answer
...   

В функции ask() ответы взвешиваются, поэтому, когда пациента спрашивают о симптомах, связанных с заболеванием, которое он, вероятно, имеет, он с большей вероятностью отвечает да на каждый симптом. Когда его спросят о симптомах заболевания, которого у него нет, он с большей вероятностью ответит «нет».

Я реорганизовал ваши данные о заболевании / симптомах в словарь для облегчения доступа и организации:

>>> symptom_dict = {'possibles': ['InfluenzaA', 'InfluenzaB', 'InfluenzaC', 'CommonCold', 'Pneumonia', 'StrepThroat', 'b', 'n', 'Croup', 'EnterovirusD68', 'h', 'Herpangina', 'PinkEye', 'Pertussis'], 'InfluenzaA': ['Cough', 'Runny noseStuffy nose', 'Sneezing', 'Sorethroat', 'Fever', 'Headache', 'Bodychills', 'Fatigue', 'Body aches'], 'CommonCold': ['Cough', 'Runny nose', 'Stuffy nose', 'Congestion', 'Sneezing', 'Sore throat', 'Fever', 'Headache', 'Malaise'], 'InfluenzaB': ['Cough', 'Stuffy nose', 'Sore throat', 'Fever', 'Headache', 'Body chills', 'Fatigue', 'Muscle aches', 'Nausea', 'Vomiting'], 'InfluenzaC': ['Cough', 'Rhinorrhea', 'Fever', 'Headache', 'Muscle pain'], 'Pneumonia': ['Cough', 'Chest pain', 'Fever', 'Fatigue', 'Loss of appetite', 'Body pain', 'Shortness of breath', 'Fast heartbeat'], 'StrepThroat': ['Fever', 'Headache', 'Throat pain', 'Loss of appetite', 'Nausea', 'Vomiting', 'White dots', 'Red dots', 'Inability or diffuculty swallowing'], 'Bronchiolitis': ['Cough', 'Runny nose', 'Stuffy nose', 'Fever', 'Shortness of breath', 'Wheezing', 'Ear pain', 'Loss of fluids'], 'Norovirus': ['Fever', 'Abdominal pain', 'Malaise', 'Muscle pain', 'Diarrhea', 'Nausea', 'Vomiting'], 'Croup': ['Cough', 'Runny nose', 'Stuffy nose', 'Shortness of breath', 'Wheezing', 'Sore throat', 'Fever', 'Throat pain', 'Fatigue'], 'EnterovirusD68': ['Cough', 'Runny nose', 'Stuffy nose', 'Sneezing', 'Wheezing', 'Fever', 'Body aches'], 'HandFootandMouthDisease': ['Sore throat', 'Fever', 'Headache', 'Fatigue', 'Rash', 'Drooling'], 'Herpangina': ['Sore throat', 'Fever', 'Headache', 'Fatigue', 'Loss of appetite', 'Inabilty or diffuculty swallowing', 'Mouth blisters or ulcers', 'Drooling', 'Vomiting'], 'PinkEye': ['Red eye', 'Eye discharge', 'Blurred vision', 'Light sensitivity'], 'Pertussis': ['Cough', 'Runny nose', 'Stuffy nose', 'Fever', 'Fatigue', 'Vomiting', 'Mucus in the throat']}

Проведя пробежку, мы получим вывод, подобный следующему:

>>> patient = get_patient()
>>>
>>> interview_patient(patient)

have you experienced Cough                               no
have you experienced Runny noseStuffy nose               yes
have you experienced Sneezing                            yes
have you experienced Sorethroat                          yes
have you experienced Fever                               no
have you experienced Headache                            yes
have you experienced Bodychills                          yes
have you experienced Fatigue                             yes
have you experienced Body aches                          no
have you experienced Cough                               yes
<< list continues on and on >>

И после всех вопросов у нас есть история пациентов с подсчетами по каждой болезни. Основываясь на этих показателях, вы могли бы дать им оценку вероятности или что-то для каждой болезни:

>>> patient
{'likelihood': 'StrepThroat', 
'InfluenzaA': {'yes': 4, 'no': 14, 'total': 18}, 
'InfluenzaB': {'yes': 4, 'no': 16, 'total': 20}, 
'InfluenzaC': {'yes': 1, 'no': 9, 'total': 10}, 
'CommonCold': {'yes': 2, 'no': 16, 'total': 18}, 
'Pneumonia': {'yes': 1, 'no': 15, 'total': 16}, 
'StrepThroat': {'yes': 17, 'no': 1, 'total': 18}, 
'Croup': {'yes': 5, 'no': 13, 'total': 18}, 
'EnterovirusD68': {'yes': 2, 'no': 12, 'total': 14}, 
'Herpangina': {'yes': 2, 'no': 16, 'total': 18}, 
'PinkEye': {'yes': 1, 'no': 7, 'total': 8}, 
'Pertussis': {'yes': 3, 'no': 11, 'total': 14}}

Приведите это воедино просто в качестве быстрого примера, это может быть то, что вы могли бы использовать.

0 голосов
/ 04 марта 2020

распечатайте список «возможных» после выполнения первого ask (), проверьте, существует ли еще «Herpangina» в списке

...