2

私はプログラミングが初めてで、Pythonを学んでいます。私が以下に書いたコードは、スケール (たとえば 100 に対して 14/20 または 70) を入力して、A から E までの評点を与えるプログラム用です。基本的に私が知りたいのはリストの整数を1つずつ取得して10、100などで乗算するのではなく、リストの整数を「取得」する方法がある場合。

要約すると、グレード ["14 sur 20"] を a = 14 および b = 20 にするために、私が書いたすべてのコードを記述する必要はありません。

PS : 私のコードは長すぎると思いますが、私は Python の初心者であり、コードを短くするための十分な知識がまだありません。

import os

grade = input ("Entrez votre note :")
deter = []
redet = []

i = z = a = b = x = 0

while i < len(grade):
    if grade[i] == "s" and grade[i+1] == "u" and grade [i+2] == "r" : #checking if the grade is written as " x sur y"
        while z < i-1 : #building a list for the grade
            deter.append (grade[z])
            z += 1
        z += 5 #jumping to the scale
        while z < len(grade) : #building a list for the scale
            redet.append (grade[z])
            z += 1

    elif grade[i] == "/" : #means grade is written as "x/y"
        while z < i : #building a list for the grade
            deter.append (grade[z])
            z += 1
        z += 1 #jumping to the scale
        while z < len(grade) : #building a list for the scale
            redet.append (grade[z])
            z += 1

    i += 1

redet = list (map(float, redet)) #converting to integers
deter = list (map(float, deter))

if len(deter)>1 :
    y = 10**(len(deter)-1)
else:
    y = 1

while x < len(deter) : #making variables
    a = a + deter[x]*y
    x += 1
    y /= 10

x = 0
if len(redet)>1 :
    y = 10**(len(redet)-1)
else :
    y = 1

while x < len(redet) : #making variables
    b = b + redet[x]*y
    x += 1
    y /= 10

grade = a/b
if grade >= 0.8 :
    print("A")
elif grade >= 0.6 :
    print("B")
elif grade >= 0.5 :
    print("C")
elif grade >= 0.4 :
    print("D")
elif grade <= 0.4 :
    print("E")

os.system ("pause")
4

4 に答える 4

5

re.splitを使用して、14 sur 20またはのように文字列14/20を 2 つに分割できます。

また、bisect.bisectを使用して、スコアを文字の成績に変換できます。

import bisect
import re

def lettergrade(score, breakpoints = [40, 50, 60, 80], grades = 'EDCBA'):
    """
    >=80 -> A
    >=60 -> B
    >=50 -> C
    >=40 -> D
    else -> E
    """
    i = bisect.bisect(breakpoints, score)
    return grades[i]


grade = input("Entrez votre note : ")
a, b = map(int, re.split(r'sur|/', grade))
print(lettergrade(100.0*a/b))

正規表現パターンの説明:

`re.split(r'sur|/', grade)` splits the string `grade` into a list of strings. It splits on the regex pattern `r'sur|/'`. This regex pattern matches the literal string `sur` or the forward-slash `/`. The `|` is the regex syntax for "or". 

r前にあるのは、Python がraw stringとして'sur|/'解釈する Python 構文です。これは、バックスラッシュの解釈方法に影響します。re モジュールのドキュメントでは、その使用方法が次のように説明されています。'sur|/'

正規表現では、バックスラッシュ文字 ( '\') を使用して、特別な形式を示したり、特別な意味を呼び出すことなく特殊文字を使用できるようにしたりします。これは、Python が文字列リテラルで同じ目的のために同じ文字を使用することと衝突します。たとえば、リテラル バックスラッシュに一致させる'\\\\' には、パターン文字列として記述する必要がある場合があります。正規表現は である必要が\\あり、各バックスラッシュは\\通常の Python 文字列リテラル内で表現する必要があるためです。

解決策は、正規表現パターンに Python の raw 文字列表記を使用することです。で始まる文字列リテラルでは、バックスラッシュは特別な方法で処理されません'r'。とr"\n"を含む 2 文字の文字列'\''n'同様で、"\n"は改行を含む 1 文字の文字列です。通常、パターンは、この生の文字列表記を使用して Python コードで表現されます。

生の文字列の詳細については、言語リファレンス docを参照してください。

この場合、生の文字列r'sur|/'は通常の string と同じですが、'sur|/'常に生の文字列で正規表現パターンを作成することをお勧めします。この場合は害はありませんが、他の場合には間違いなく役立ちます。

re.split文字列のリストを返すため、文字列を次map(int, ...)のように変換するために使用されます。ints

In [37]: grade = '14 sur 20'

In [38]: re.split(r'sur|/', grade)
Out[38]: ['14 ', ' 20']

In [39]: map(int, re.split(r'sur|/', grade))
Out[39]: [14, 20]
于 2013-07-25T19:38:15.227 に答える
0
a,b = map(int,input ("Entrez votre note :").lower().split("sur"))

入力があなたの言うことと一致すると仮定すると、それはうまくいくはずです。

于 2013-07-25T19:35:10.903 に答える
0

これは役に立つかもしれません:

>>> s = "15 over 20"
>>> s.split()
['15', 'over', '20']

>>> [int(x) for x in s.split()]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'over'

>>> [int(x) for x in s.split() if x.isdigit()]
[15, 20]
于 2013-07-25T19:42:20.160 に答える
0
def printLetterGrade(rawGrade):
  grade = rawGrade/20
  if grade >= 0.8 :
    print("A")
  elif grade >= 0.6 :
    print("B")
  elif grade >= 0.5 :
    print("C")
  elif grade >= 0.4 :
    print("D")
  elif grade <= 0.4 :
    print("E")

rawGrade = int(input ("Entrez votre note entre 1 et 20:"))
printLetterGrade(rawGrade)

IIRC のフランスの等級尺度は常に 20 を基準としているため、基準を入力せずに等級を入力するように指示するだけで、最初に必要な入力を受け入れることができます。

于 2013-07-25T19:38:51.657 に答える