Análise em listas em Python

Olá, estou fazendo um programa simples para indicar um paciente que tenha mais prioridade.
Consigo adicionar os dados a um dicionário e depois copio para uma lista para analisar.
Mas se adiciono 2 pacientes com prioridade alta só retorna 1, se adiciono 3 retorna 2 :confused:.
Alguem pode me ajudar?

Segue o código abaixo:

pacientes = dict()
prioridade = list()
while True:
    pacientes['nome'] = str(input('Nome: '))
    pacientes['idade'] = str(input('Idade do(a) Paciente: '))
    pacientes['doenca'] = str(input('Qual é a doença? '))
    pacientes['gravidade'] = str(input('Qual é a gravidade? '))
    resp = str(input('Receber análise de prioridade? [S/N]'))
    if resp in 'sS':
        break
    prioridade.append(pacientes.copy())
print('Os pacientes com prioridade alta são: ')
for p in prioridade:
    if p['gravidade'] == 'Alta':
         print(f'A lista de prioridade é: {p["nome"]}')

O seu problema está no trecho de código abaixo:

Você chama break antes de copiar o último paciente a lista de prioridades. Dessa forma você sempre perderá os dados da última pessoa digitada.
Inverta a posição do if e da cópia e deve funcionar:

prioridade.append(pacientes.copy())
if resp in 'sS':
  break

Outra dica é usar nomes de variáveis que façam sentido com o que elas estão fazendo.
O dicionário aqui é um paciente só, não pacientes.
Do mesmo jeito a sua lista contém pacientes e não prioridade

1 curtida

Além do que já foi respondido acima, tem mais algumas coisas:

input já retorna uma string, então fazer str(input(...)) é redundante e desnecessário. Use apenas input(...) que já terá a string.

Em vez de copiar o dicionário todas as vezes, você pode criar um novo dicionário dentro do while - na prática o efeito é o “mesmo”, mas criar cópias esconde algumas armadilhas (no seu caso não acontece, mas o simples fato de poder acontecer já sugere que talvez seja melhor não criar cópias e sim um novo dicionário).

E se quer que a comparação seja case insensitive, pode converter o retorno de input para minúscula, usando lower(). Tem um pequeno detalhe em fazer if resp in 'sS': se a pessoa digitar “sS”, também entra neste if. É um pequeno detalhe, mas que pode comprometer a usabilidade.

Resumindo, ficaria assim:

# a lista é de pacientes, não de prioridades
pacientes = list()
while True:
    # cria um novo dicionário, pois no fundo é isso que vc quer (não quero uma "cópia", pois cada paciente é independente dos outros)
    # nome no singular, pois o dicionário só tem os dados de um único paciente
    paciente = dict()
    paciente['nome'] = input('Nome: ')
    paciente['idade'] = input('Idade do(a) Paciente: ')
    paciente['doenca'] = input('Qual é a doença? ')
    paciente['gravidade'] = input('Qual é a gravidade? ')
    pacientes.append(paciente) # não precisa copiar
    # transforma em minúscula (e nem precisa da variável na verdade)
    if input('Receber análise de prioridade? [S/N]').lower() == 's':
        break

print('Os pacientes com prioridade alta são: ')
for p in pacientes:
    if p['gravidade'] == 'Alta':
         print(f'- {p["nome"]}')

Outra opção é criar o dicionário no próprio append, assim:

while True:
    nome = input('Nome: ')
    idade = input('Idade do(a) Paciente: ')
    doenca = input('Qual é a doença? ')
    gravidade = input('Qual é a gravidade? ')
    pacientes.append({
        'nome': nome, 'idade': idade, 'doenca': doenca, 'gravidade': gravidade
    })
    # transforma em minúscula (e nem precisa da variável na verdade)
    if input('Receber análise de prioridade? [S/N]').lower() == 's':
        break

Ou, ainda:

while True:
    pacientes.append({
        'nome': input('Nome: '),
        'idade': input('Idade do(a) Paciente: '),
        'doenca': input('Qual é a doença? '),
        'gravidade': input('Qual é a gravidade? ')
    })
    # transforma em minúscula (e nem precisa da variável na verdade)
    if input('Receber análise de prioridade? [S/N]').lower() == 's':
        break
1 curtida

Muito obrigado pelas dicas.

Muito obrigado, não vou esquecer essas dicas.