Как сгенерировать вывод из списка и словаря и сопоставить полученный результат из них со значением словаря? - PullRequest
0 голосов
/ 22 декабря 2018

Как вы, люди, говорите, это своего рода задание или «домашняя работа», и я проясняю ее только в начале.Я новичок в Python, и меня действительно смущают проблемы такого рода.

Поставленная проблема: больница по уходу хочет знать медицинскую специальность, которую посещает максимальное количество пациентов.Предположим, что идентификатор пациента вместе с медицинской специальностью, которую посетил пациент, сохранен в списке.Подробная информация о медицинских специальностях хранится в словаре следующим образом: {"P": "Педиатрия", "O": "Ортопедия", "E": "ENT}

Напишите функцию, чтобы найтимедицинская специальность, посещенная максимальным числом пациентов и возвращающая название специальности.

Код, который я пытался:

def max_visited_speciality(patient_medical_speciality_list,medical_speciality):
    speciality_list=[]
    for words in patient_medical_speciality_list:
        if words in medical_speciality:
                speciality_list.append(words)
                speciality=max(speciality_list)
                return speciality

#provide different values in the list and test your program
patient_medical_speciality_list=[301,'P',302, 'P' ,305, 'P' ,401, 'E' ,656, 'E']
medical_speciality={"P":"Pediatrics","O":"Orthopedics","E":"ENT"}
speciality = max_visited_speciality(patient_medical_speciality_list,medical_speciality)
print(speciality)

Пример ввода: [101, P, 102, O, 302,P, 305, P]

Ожидаемый результат: Педиатрия

Результат, который я получаю: P

Ответы [ 4 ]

0 голосов
/ 17 марта 2019
def max_visited_speciality(patient_medical_speciality_list,medical_speciality):
    # write your logic here
    a=len(patient_medical_speciality_list)
    b=patient_medical_speciality_list[1:a:2]
    c=[]
    d=[]
    for key in medical_speciality:
        c.append(key)
    #print(c)
    for i in c:
        d.append(b.count(i))
    #print(d)
    x=d.index(max(d))
    #print(x)
    return medical_speciality[c[x]]



#return speciality


patient_medical_speciality_list=[301,'P',302, 'P' ,305, 'P' ,401, 'E' ,656, 'E']
medical_speciality={"P":"Pediatrics","O":"Orthopedics","E":"ENT"}
speciality=max_visited_speciality(patient_medical_speciality_list,medical_speciality)
print(speciality)
0 голосов
/ 22 декабря 2018

Это должно сделать это:

def max_visited_speciality(patient_medical_speciality_list, medical_speciality):

    # count each speciality patients
    counts = {}
    for _, speciality in zip(patient_medical_speciality_list[::2], patient_medical_speciality_list[1::2]):
        counts[speciality] = counts.get(speciality, 0) + 1

    # get most visited speciality by count of it's patients
    most_visited_speciality = max(medical_speciality, key=lambda e: counts.get(e, 0))

    # return value of most visited speciality
    return medical_speciality[most_visited_speciality]


# provide different values in the list and test your program
patient_medical_speciality_list = [301, 'P', 302, 'P', 305, 'P', 401, 'E', 656, 'E']
medical_speciality = {"P": "Pediatrics", "O": "Orthopedics", "E": "ENT"}
speciality = max_visited_speciality(patient_medical_speciality_list, medical_speciality)
print(speciality)

Вывод

Pediatrics

Сначала необходимо подсчитать каждого пациента по специальности:

# count each speciality patients
    counts = {}
    for _, speciality in zip(patient_medical_speciality_list[::2], patient_medical_speciality_list[1::2]):
        counts[speciality] = counts.get(speciality, 0) + 1

После этого counts = {'E': 2, 'P': 3}, потому что есть 3 пациента, которые посетили 'P' и 2, которые посетили 'E'.Затем используйте эти значения в качестве ключей в max:

most_visited_speciality = max(medical_speciality, key=lambda e: counts.get(e, 0))

Возвращает 'P' наиболее посещаемую специальность, затем возвращает значение 'P' в словаре medical_speciality,

return medical_speciality[most_visited_speciality]

в данном случае: 'Pediatrics'.

Далее

  1. Документация на max .
  2. документация по get методу dict.
0 голосов
/ 22 декабря 2018

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

from collections import Counter


class MedicalSpecialityError(Exception):
    pass


medical_speciality_map = {"P": "Pediatrics", "O": "Orthopedics", "E": "ENT"}
patient_medical_speciality_list = [301, 'P', 302, 'P', 305, 'P', 401, 'E', 656, 'E']


def max_visited_speciality(patient_medical_speciality_list: list):
    counts = Counter(s for s in patient_medical_speciality_list if str(s).isalpha())
    try:
        med_spec = medical_speciality_map[counts.most_common()[0][0]]
    except IndexError:
        raise MedicalSpecialityError('Bad "patient_medical_speciality_list"')
    except KeyError:
        raise MedicalSpecialityError('Unknown medical speciality key')

    return med_spec


print(max_visited_speciality(patient_medical_speciality_list))

Вывод:

Pediatrics

PS Привыкнуть к "хорошим практикам".

0 голосов
/ 22 декабря 2018

Вы почти там.

в вашем цикле for, words содержит строку P или E.Теперь вам просто нужно использовать это для вызова ключа в вашем словаре:

пример: когда word равно 'P', чтобы получить значение, вы должны использовать medical_speciality['P'], чтобы получить значение Pediatrics.Поэтому мы просто включим это в вашу функцию.

Далее, max не работает, как вы думаете здесь.Вам понадобится способ подсчитать, сколько раз будет отображаться 'P' или 'E', тогда вы действительно просто захотите это максимальное значение.

Я бы также переместил вашу часть

speciality=max(speciality_list)
return speciality`

вне цикла for, так как вы хотите получить максимум из этого полного списка, где, как он в настоящее время делает max и return после каждой итерации, что не нужно.

def max_visited_speciality(patient_medical_speciality_list,medical_speciality):
    speciality_list=[]
    for words in patient_medical_speciality_list:
        if words in medical_speciality:
                speciality_list.append(words)

    counts = dict(map(lambda x  : (x , speciality_list.count(x)) , speciality_list))
    most_visited_speciality = max(counts, key=lambda e: counts.get(e, 0))
    return medical_speciality[most_visited_speciality]

#provide different values in the list and test your program
patient_medical_speciality_list=[301,'P',302, 'P' ,305, 'P' ,401, 'E' ,656, 'E']
medical_speciality={"P":"Pediatrics","O":"Orthopedics","E":"ENT"}
speciality = max_visited_speciality(patient_medical_speciality_list,medical_speciality)
print(speciality)

Выход:

>>> print(speciality)
>>> Pediatrics
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...