Celem jest zbudowanie programu do konwersji wyników z systemu „0 na 1” na system „F na A”:
- Gdyby
score >= 0.9
wydrukował „A” - Gdyby
score >= 0.8
wydrukował „B” - 0,7, C
- 0,6, D
- I każdą wartość poniżej tego punktu, wydrukuj F.
Jest to sposób na zbudowanie go i działa w programie, ale jest nieco powtarzalny:
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')
Chciałbym wiedzieć, czy istnieje sposób na zbudowanie funkcji, aby instrukcje złożone nie były tak powtarzalne.
Jestem całkowicie początkującym, ale chciałbym coś w stylu:
def convertgrade(scr, numgrd, ltrgrd):
if scr >= numgrd:
return ltrgrd
if scr < numgrd:
return ltrgrd
dać?
Chodzi o to, że później możemy to nazwać, przekazując argumenty scr, numergrade i ocenę liter jako argumenty:
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')
Gdyby można było przekazać mniej argumentów, byłoby jeszcze lepiej.
python
if-statement
dry
Matheus Bezerra Soares
źródło
źródło
Odpowiedzi:
Możesz użyć modułu bisect , aby wyszukać tabelę numeryczną:
źródło
bisect
, które moim zdaniem jest używane zbyt rzadko.Możesz zrobić coś według następujących zasad:
Używa to
next
z domyślnym argumentem generatora nad parami ocen utworzonymi przezzip
. Jest to właściwie dokładny odpowiednik podejścia w pętli.źródło
Każdej klasie można przypisać wartość progową:
źródło
sorted(grades.items())
ponieważ nie gwarantuje się sortowania nagrań.dict
jest niepotrzebnie ciężką strukturą danych, ponieważ liczy się kolejność, a ty i tak patrzysz na indeks (kolejność), a nie na klucz.grades[int(score*10)/10.0]
, ale powinieneś użyć,Decimal
ponieważ zmiennoprzecinkowe są notorycznie źle działającymi klawiszami dict.W tym konkretnym przypadku nie potrzebujesz zewnętrznych modułów ani generatorów. Wystarczy podstawowa matematyka (i to szybciej)!
źródło
Możesz użyć
np.select
z biblioteki numpy dla wielu warunków:źródło
Mam prosty pomysł na rozwiązanie tego:
Teraz,
źródło
Możesz użyć
numpy.searchsorted
, co dodatkowo daje tę przyjemną opcję przetwarzania wielu wyników w jednym wywołaniu:źródło
Dostarczyłeś prostą skrzynkę. Jeśli jednak twoja logika staje się bardziej skomplikowana, możesz potrzebować silnika reguł, aby poradzić sobie z chaosem.
Możesz wypróbować silnik Sauron Rule lub znaleźć niektóre silniki reguł Python z PYPI.
źródło
źródło
Możesz także zastosować podejście rekurencyjne:
źródło
Oto niektóre bardziej zwięzłe i mniej zrozumiałe podejścia:
Pierwsze rozwiązanie wymaga użycia funkcji podłogi z
math
biblioteki.A jeśli z jakiegoś powodu importowanie
math
biblioteki Ci przeszkadza. Możesz użyć obejścia funkcji podłogi:Są to nieco skomplikowane i odradzam ich używanie, chyba że rozumiesz, co się dzieje. Są to konkretne rozwiązania, które wykorzystują fakt, że przyrosty w stopniach wynoszą 0,1, co oznacza, że użycie przyrostu innego niż 0,1 prawdopodobnie nie zadziałałoby przy użyciu tej techniki. Nie ma również łatwego interfejsu do mapowania ocen do ocen. Bardziej ogólne rozwiązanie, takie jak Dawg używające dwusiecznej, jest prawdopodobnie bardziej odpowiednie lub bardzo czyste rozwiązanie schwobaseggl. Nie jestem do końca pewien, dlaczego publikuję tę odpowiedź, ale jest to tylko próba rozwiązania problemu bez bibliotek (nie twierdzę, że używanie bibliotek jest złe) w jednym wierszu, co pokazuje wszechstronność Pythona.
źródło
Możesz użyć słownika.
Kod
Próbny
Jeśli wyniki faktycznie wynoszą od 0 do 1, najpierw pomnóż 100, a następnie sprawdź wynik.
źródło
Nadzieja może pomóc: if 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”)
źródło
Możesz mieć listę liczb, a następnie listę ocen, aby przejść z nią:
Następnie, jeśli chcesz przekonwertować określony wynik na ocenę literową, możesz to zrobić:
Wtedy twój końcowy wynik byłby
"B"
.źródło
0.83
z oceny"B"
. Będziesz musiał pokazać, jak przejść od wyniku do indeksuitem
.