Tujuannya adalah untuk membangun program untuk mengonversi skor dari sistem '0 ke 1' ke sistem 'F ke A':
- Jika
score >= 0.9
mau mencetak 'A' - Jika
score >= 0.8
mau mencetak 'B' - 0,7, C
- 0,6, D
- Dan nilai apa pun di bawah titik itu, cetak F
Ini adalah cara untuk membuatnya dan bekerja pada program, tetapi ini agak berulang:
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')
Saya ingin tahu apakah ada cara untuk membangun fungsi sehingga pernyataan majemuk tidak akan berulang.
Saya seorang pemula total, tetapi akankah ada sesuatu di baris:
def convertgrade(scr, numgrd, ltrgrd):
if scr >= numgrd:
return ltrgrd
if scr < numgrd:
return ltrgrd
menjadi mungkin?
Maksudnya di sini adalah bahwa nanti kita bisa menyebutnya dengan hanya meneruskan scr, numbergrade, dan grade surat sebagai argumen:
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')
Jika dimungkinkan untuk mengeluarkan lebih sedikit argumen, itu akan lebih baik.
python
if-statement
dry
Matheus Bezerra Soares
sumber
sumber
Jawaban:
Anda dapat menggunakan modul bisect untuk melakukan pencarian tabel numerik:
sumber
bisect
, yang menurut saya terlalu jarang digunakan.Anda dapat melakukan sesuatu seperti ini:
Ini digunakan
next
dengan argumen default pada generator di atas pasangan skor-skor yang dibuat olehzip
. Ini sebenarnya setara dengan pendekatan loop Anda.sumber
Anda dapat menetapkan nilai ambang untuk setiap nilai:
sumber
sorted(grades.items())
karena dicts tidak dijamin akan diurutkan.dict
adalah struktur data berat yang tidak perlu, karena itu urutan yang penting, dan Anda mencari berdasarkan indeks (pesanan), bukan dengan kunci.grades[int(score*10)/10.0]
, tetapi kemudian Anda harus menggunakannyaDecimal
karena float adalah kunci dikt yang terkenal buruk.Dalam kasus khusus ini Anda tidak perlu modul atau generator eksternal. Beberapa matematika dasar sudah cukup (dan lebih cepat)!
sumber
Anda dapat menggunakan
np.select
dari numpy library untuk berbagai kondisi:sumber
Saya punya ide sederhana untuk menyelesaikan ini:
Sekarang,
sumber
Anda dapat menggunakan
numpy.searchsorted
, yang juga memberi Anda opsi bagus untuk memproses beberapa skor dalam satu panggilan:sumber
Anda memberikan kasus sederhana. Namun jika logika Anda semakin rumit, Anda mungkin memerlukan mesin aturan untuk menangani kekacauan.
Anda dapat mencoba mesin Sauron Rule atau menemukan beberapa mesin aturan Python dari PYPI.
sumber
sumber
Anda juga bisa menggunakan pendekatan rekursif:
sumber
Berikut adalah beberapa pendekatan yang lebih ringkas dan kurang dimengerti:
Solusi pertama membutuhkan penggunaan fungsi lantai dari
math
perpustakaan.Dan jika karena alasan tertentu mengimpor
math
perpustakaan mengganggu Anda. Anda bisa menggunakan pekerjaan di sekitar untuk fungsi lantai:Ini agak rumit dan saya akan menyarankan untuk tidak menggunakannya kecuali Anda mengerti apa yang sedang terjadi. Mereka adalah solusi spesifik yang mengambil keuntungan dari fakta bahwa kenaikan nilai adalah 0,1 yang berarti bahwa menggunakan kenaikan selain 0,1 mungkin tidak akan berhasil menggunakan teknik ini. Itu juga tidak memiliki antarmuka yang mudah untuk memetakan tanda ke nilai. Solusi yang lebih umum seperti solusi dawg menggunakan bisect mungkin lebih tepat atau solusi schwobaseggl yang sangat bersih. Saya tidak benar-benar yakin mengapa saya memposting jawaban ini tetapi itu hanya upaya memecahkan masalah tanpa perpustakaan (saya tidak mencoba mengatakan bahwa menggunakan perpustakaan itu buruk) dalam satu baris menunjukkan sifat serbaguna python.
sumber
Anda dapat menggunakan dict.
Kode
Demo
Jika skor sebenarnya antara 0 dan 1, kalikan pertama 100, lalu cari skor.
sumber
Semoga yang berikut dapat membantu: jika scr> = 0,9: print ('A') elif 0,9> scr> = 0,8: print ('B') elif 0,8> scr> = 0,7: Cetak ('C') elif 0,7 scr> = 0.6: cetak ('D') lain: cetak ('F')
sumber
Anda bisa memiliki daftar angka, lalu daftar nilai yang menyertainya:
Kemudian, jika Anda ingin mengonversi skor yang ditentukan ke nilai huruf, Anda bisa melakukan ini:
Maka skor akhir Anda akan menjadi
"B"
.sumber
0.83
ke kelas"B"
. Anda harus menunjukkan cara mendapatkan dari skor ke indeksitem
.