压缩大的Unpythony if语句

压缩大的Unpythony if语句,python,if-statement,for-loop,Python,If Statement,For Loop,我有大量的if-elif-else语句,效果很好。。。他们看起来非常不和谐,我要把我需要的数字增加一倍。基本上,我是为一个图形的x值的数量获取一个用户输入,通过一个数据分类器发送它,并绘制它。为了简单起见,我只放了x=1(最小)和x=6(最大)的值,但我想添加一个“有多少个y?”但我担心这会太过庞大和混乱 我能把这个浓缩一下吗 代码: 除x1为x(n)到6外,以下部分相同。代码都是正确的,我只需要把x1改成x(1-6) 看起来很多,这可能只是因为我的代码很乱。我认为它只需要一个简单的for循环,

我有大量的if-elif-else语句,效果很好。。。他们看起来非常不和谐,我要把我需要的数字增加一倍。基本上,我是为一个图形的x值的数量获取一个用户输入,通过一个数据分类器发送它,并绘制它。为了简单起见,我只放了x=1(最小)和x=6(最大)的值,但我想添加一个“有多少个y?”但我担心这会太过庞大和混乱

我能把这个浓缩一下吗

代码:

除x1为x(n)到6外,以下部分相同。代码都是正确的,我只需要把x1改成x(1-6)


看起来很多,这可能只是因为我的代码很乱。我认为它只需要一个简单的for循环,但我已经不知所措了,所以我不知道从哪里开始。一切都很顺利。它看起来很凌乱

只需让输入部分保留六列数字列表,而不是六个单独的变量,就可以重写输入部分:

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)
    )
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)))
然后简单地将整个第二个块放入这个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)轴
,以便以后使用,请保留这些变量的列表,方法是在下面的行中:

xaxes = []
在循环之前,添加行

    xaxes.append(x1Axis)

在循环中。之后,您可以访问以前的
x1Axis
x2Axis
。。。如
xaxes[0]
xaxes[1]
等等。

您使用了太多的变量而不是数组。您可以使用for循环和数组
x

x = [None]*howManyX
for i in range(howManyX):
    x[i] = int(raw_input("Input column number for x%d-value: " % (i+1)))
在特定情况下,您可以设置回类变量(使用内置的
setattr
),或者在使用简单脚本的情况下,您甚至可以设置全局变量(如果确实需要):


您可能只需将每个
xN
变量转换为某个数组中的等效变量即可。例如
xs
。。。虽然在本例中,您应该以它的名称命名,而不仅仅是
x

第一部分将类似于:

howManyX = int(raw_input('Input number of x-values for this graph: '))
xs = [1]*howManyX
for i in range(howManyX):
    xs[i] = int(raw_input("Input column number for x%i-value: " % (i+1)))

当然,另一个块也需要更新变量。如果您在不同的
x
s之间使用变量,您可以执行
xax[i]
,或者如果它们只是单个
x
的本地变量,则完全删除该数字。

您可以让用户输入他们感兴趣的值(比如以
dict
的形式)并对其进行评估。这样他们就可以指定第7列和第12列,而不用担心其他列。。。如果希望,您可以使用
max(vals)
获取引用的最高列。。。(或者定义了密钥->值对关系)


那么,如果有两个,会发生什么呢?请注意,这并不符合问题的要求,因为他在代码中只提供了1和6个案例:
为了简单起见,我只给出了x=1(最小)和x=6(最大)值
我一定不理解这个问题。我会把它留在这里,除非它是有效的。请不要设置为
locals
。大多数时候它甚至不起作用。好吧,没错。我将把它改为globals(),它可以在imo中更改。不,请不要这样做/@Veedrac认为globals()(除了局部变量)字典可以修改。它仍然在CPython 2/3、PyPy中受支持。。。但我明白,在这种情况下,以及在一般情况下,应该避免使用全局变量。之后如何独立使用每个xAxis值?(在图形上创建多个x轴)因为每次只需在每个x轴上保存,所以有没有办法随着for循环的进行而改变变量?说从x1轴转到x2轴?
x = [None]*howManyX
for i in range(howManyX):
    x[i] = int(raw_input("Input column number for x%d-value: " % (i+1)))
scope = globals()   # in case of simple script
scope = self.__dict__
for i, val in enumerate(x):
   scope["x%d" % (i+1)] = val
howManyX = int(raw_input('Input number of x-values for this graph: '))
xs = [1]*howManyX
for i in range(howManyX):
    xs[i] = int(raw_input("Input column number for x%i-value: " % (i+1)))
from ast import literal_eval

# User enters something like: { 1:3, 5: 2}
vals = literal_eval(raw_input()) 
if not isinstance(vals, dict):
    # Uh oh... maybe do something here?
# Then use (to get columns, or 1 or whatever if not entered)
col_val3 = vals.get(3, 1)