O objetivo é criar um programa para converter pontuações de um sistema '0 para 1' em um sistema 'F para A':
- Se
score >= 0.9
imprimir 'A' - Se
score >= 0.8
imprimir 'B' - 0,7, C
- 0,6, D
- E qualquer valor abaixo desse ponto, imprima F
Esta é a maneira de construí-lo e funciona no programa, mas é um pouco repetitivo:
if scr >= 0.9:
print('A')
elif scr >= 0.8:
print('B')
elif scr >= 0.7:
print('C')
elif scr >= 0.6:
print('D')
else:
print('F')
Gostaria de saber se existe uma maneira de criar uma função para que as instruções compostas não sejam tão repetitivas.
Sou totalmente iniciante, mas seria algo nas linhas de:
def convertgrade(scr, numgrd, ltrgrd):
if scr >= numgrd:
return ltrgrd
if scr < numgrd:
return ltrgrd
seja possível?
A intenção aqui é que, mais tarde, possamos chamá-lo passando apenas scr, numbergrade e letter grade como argumentos:
convertgrade(scr, 0.9, 'A')
convertgrade(scr, 0.8, 'B')
convertgrade(scr, 0.7, 'C')
convertgrade(scr, 0.6, 'D')
convertgrade(scr, 0.6, 'F')
Se fosse possível passar menos argumentos, seria ainda melhor.
python
if-statement
dry
Matheus Bezerra Soares
fonte
fonte
Respostas:
Você pode usar o módulo bisect para fazer uma pesquisa de tabela numérica:
fonte
bisect
, que acho usado muito raramente.Você pode fazer algo nesse sentido:
Isso é usado
next
com um argumento padrão em um gerador sobre os pares de notas e notas criados porzip
. É praticamente o equivalente exato da sua abordagem de loop.fonte
Você pode atribuir a cada nota um valor limite:
fonte
sorted(grades.items())
já que não é garantido que os dictos sejam classificados.dict
é uma estrutura de dados desnecessariamente pesada, pois é a ordem que importa, e você está pesquisando por índice (ordem) de qualquer maneira, não por chave.grades[int(score*10)/10.0]
, mas então você deve usarDecimal
como flutuadores são notoriamente chaves de ditado mal comportadas.Nesse caso específico, você não precisa de módulos ou geradores externos. Alguma matemática básica é suficiente (e mais rápida)!
fonte
Você pode usar
np.select
da biblioteca numpy para várias condições:fonte
Eu tenho uma idéia simples para resolver isso:
Agora,
fonte
Você pode usar
numpy.searchsorted
, o que adicionalmente oferece a você essa ótima opção de processar várias pontuações em uma única chamada:fonte
Você forneceu um caso simples. No entanto, se sua lógica estiver ficando mais complicada, talvez você precise de um mecanismo de regras para lidar com o caos.
Você pode experimentar o mecanismo Sauron Rule ou encontrar alguns mecanismos de regras Python no PYPI.
fonte
fonte
Você também pode usar uma abordagem recursiva:
fonte
Aqui estão algumas abordagens mais sucintas e menos compreensíveis:
A primeira solução requer o uso da função de andar da
math
biblioteca.E se, por algum motivo, importar a
math
biblioteca está incomodando você. Você pode usar uma solução alternativa para a função de piso:Isso é um pouco complicado e eu não recomendaria usá-los, a menos que você entenda o que está acontecendo. São soluções específicas que tiram vantagem do fato de que os incrementos nas notas são 0,1, o que significa que usar um incremento diferente de 0,1 provavelmente não funcionaria usando essa técnica. Também não possui uma interface fácil para mapear marcas para notas. Uma solução mais geral, como a dawg usando bisect, é provavelmente a mais apropriada ou a solução muito limpa de schwobaseggl. Não sei ao certo por que estou postando esta resposta, mas é apenas uma tentativa de resolver o problema sem bibliotecas (não estou tentando dizer que o uso de bibliotecas é ruim) em uma linha, demonstrando a natureza versátil do python.
fonte
Você pode usar um ditado.
Código
Demo
Se as pontuações estão realmente entre 0 e 1, multiplique 100 e procure a pontuação.
fonte
Espero que o seguinte possa ajudar: se scr> = 0,9: print ('A') elif 0.9> scr> = 0.8: print ('B') elif 0.8> scr> = 0.7: Print ('C') elif 0.7 scr> = 0.6: print ('D') else: print ('F')
fonte
Você pode ter uma lista de números e uma lista de notas para acompanhar:
Então, se você deseja converter uma pontuação especificada em uma nota de uma carta, faça o seguinte:
Então sua pontuação final seria
"B"
.fonte
0.83
a nota"B"
. Você precisaria mostrar como passar da pontuação para o índiceitem
.