0

私は巨大な if elif else ステートメントを持っていますが、うまく機能します...それらは非常に不自然に見え、必要な数を2倍にしようとしています。基本的に、グラフの x 値の数に対するユーザー入力を取得し、データ ソーターを介して送信し、グラフ化します。簡単にするために、x=1 (最小) と x=6 (最大) の値のみを入れていますが、「y はいくつですか?」を追加したいと思います。しかし、それはかさばりすぎて混乱を招くのではないかと心配しています。

これを要約する方法はありますか?

コード:

howManyX = int(raw_input('Input number of x-values for this graph: '))

if howManyX == 1:
    x1 = int(raw_input("Input column number for x1-value: "))
    x2 = 1
    x3 = 1
    x4 = 1
    x5 = 1
    x6 = 1
elif howManyX == 6:
    x1 = int(raw_input("Input column number for x1-value: "))
    x2 = int(raw_input("Input column number for x2-value: "))
    x3 = int(raw_input("Input column number for x3-value: "))
    x4 = int(raw_input("Input column number for x4-value: "))
    x5 = int(raw_input("Input column number for x5-value: "))
    x6 = int(raw_input("Input column number for x6-value: "))

以下のこの部分は、x1 が x(n) から 6 であることを除いて同じです。コードはすべて正しいです。x1 を x(1-6) に変更するだけです。

if x1 == 0:
    x1a = sheet.col_values(x1)
    x1b = [i for i in x1a if i != '']
    x1c = [i for i in x1b if type(i) == float][1:]
    x1Axis = [datetime.strptime(str(int(d)), '%Y%m%d') for d in x1c]
elif x1 == 31:
    x1a = sheet.col_values(x1)
    clear()
    print "\n\n\n1: Top"
    print "2. Bottom"
    is_valid = 0
    while not is_valid :
        try :
            choice = int ( raw_input('Enter your choice [1 or 2] : ') )
            is_valid = 1 ## set it to 1 to validate input and to terminate the while..not loop
        except ValueError, e :
            print ("'%s' is not a valid integer." % e.args[0].split(": ")[1])
    if choice == 1:
        x1Axis = filter(None, [i for i, j in zip(x1a, x1a[1:] + ['']) if j != ''])[1:]
    elif choice == 2:
        x1Axis = filter(None, [i for i, j in zip(x1a, x1a[1:] + ['']) if j == ''])[2:]
    else:
        print ("Invalid number. Try again...")
else:
    x1a = sheet.col_values(x1)
    x1Axis = filter(None, [i for i, j in zip(x1a, x1a[1:] + ['']) if j == ''])[2:]

多くのように見えますが、それは私のコードが乱雑である可能性があります。単純な for ループが必要だと思いますが、圧倒されてどこから始めればよいかわかりません。すべてがうまくいっています。乱雑に見えるだけ

4

5 に答える 5

1

入力セクションは、6 つの個別の変数ではなく、6 つの列番号のリストを保持するようにするだけで書き直すことができます。

howManyX = int(raw_input('Input number of x-values for this graph: '))

x_col_nums = [1] * 6
for i in range(howManyX):
    x_col_nums[i] = int(raw_input("Input column number for x%d-value: " % (i + 1)))

次に、2 番目のブロック全体をこの for ループに入れます。

for x1 in x_col_nums:
    # all your second block of code goes here
    # you might want to change the variable name x1 to just be x, which might
    # make it clearer

x(n)Axis後で使用できるように変数を保存するには、次の行を追加して、それらの変数のリストを保持します。

xaxes = []

ループの前に、行を追加します

    xaxes.append(x1Axis)

ループの中。x1Axisその後、 、x2Axis... などxaxes[0]にアクセスできますxaxes[1]

于 2013-09-25T15:20:17.500 に答える
0
howManyX = int(raw_input('Input number of x-values for this graph: '))

if howManyX == 1:
    x1 = int(raw_input("Input column number for x1-value: "))
    x2 = x3 = x4 = x5 = = x6 = 1

elif howManyX == 6:
    x1, x2, x3, x4, x5, x6 = (
        int(raw_input("Input column number for x{}-value: ".format(i)))
        for i in range(1, 7)
    )
于 2013-09-25T15:19:53.370 に答える
-1

配列の代わりに使用する変数が多すぎます。for loop と array を使用できますx:

x = [None]*howManyX
for i in range(howManyX):
    x[i] = int(raw_input("Input column number for x%d-value: " % (i+1)))

特定のケースでは、(ビルトインを使用してsetattr) クラス変数を元に戻すことができます。また、単純なスクリプトの場合には、グローバル変数を設定することもできます (本当に必要な場合)。

scope = globals()   # in case of simple script
scope = self.__dict__
for i, val in enumerate(x):
   scope["x%d" % (i+1)] = val
于 2013-09-25T15:22:39.697 に答える