在嵌套的for循环中添加列表

时间:2018-11-25 22:48:36

标签: python python-3.x list for-loop

我已经定义了一些数据,这些数据会追加到一些列表中。为了做到这一点,我需要将它们置于某种嵌套循环条件中。首先在1-15之间创建一个范围,然后在循环中计算rebarnumber,我在n <= rebarnumber*do something*相匹配时设置了这些条件,然后在n >= rebarnumber {{1} } 。问题是当满足上述条件时,我要做的只是获得具有完整范围数字的列表。

但是得到了这个结果。

do something else

所需的结果(仅显示最后两行打印内容)

[49.0] 1
[49.0, 49.0] 2
[49.0, 49.0, 49.0] 3
[49.0, 49.0, 49.0, 49.0] 4
[49.0, 49.0, 49.0, 49.0, 49.0] 5
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0] 6
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0] 7
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0] 8
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 9
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 10
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 11
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 12
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 13
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 14
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 49.0, 84.0] 15

代码:

[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0] 14
[49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0, 84.0] 15

我做错了什么?!任何帮助!

1 个答案:

答案 0 :(得分:2)

您的代码中有几处尴尬的事情。让我们先清理一下。

  1. 您显然已经导入了math,因为您正在使用math.floor。为什么不同时使用math.pi而不是3.1416?并且,由于它是一个常量,为什么不使用标准PEP8命名约定ALL_CAPS?另外,为什么不使用:

    import math
    
    # ...
    
    PI_Y2_4 = int((math.pi * y ** 2) / 4)
    
  2. 可以将几个“公共子表达式”存储为变量。由于在您的示例代码中,它们似乎是常量,因此您甚至可以使它们成为常量。但是,即使它们在您的实际代码中不是恒定不变的,您也可以通过只计算一次来获得清晰度,避免错误并提高速度:

    for n in range(1, 16):
        cbyby_2 = cb + yb + y / 2
        ctyby_2 = ct + yb + y / 2
    
        if n <= rebarnumber+1:
            Asi.append(PI_Y2_4)
            Asci.append(PI_Y2_4)
            dis.append(h - cbyby_2)
            disc.append(ctyby_2)
    
            if n >= rebarnumber:
                Asi.append(PI_Y2_4)
                Asci.append(PI_Y2_4)
                dis.append(h - cbyby_2 - ca)
                disc.append(cbyby_2 + ca)
    

    此外,在计算ct的值时,您是否确定cbdisc?其他所有内容都保持不变,但是这两个更改。可能是错字吗?

现在,这些问题已经解决了,让我们看看您的“得了”与“想要”的例子。您“获得”了一堆列表,这些列表在n == 9处停止增长。您“想要”一堆不断增长(由一个到n == 15的列表。

看看代码的形状,我看到了:

for ...:
    if ...
        if ...
    print()

这表示print语句每次都会出现,但是append方法仅在第一个if语句通过时才被调用。此外,由于第二条if语句包含在第一条if语句中,所以当该语句通过时,您将两次附加到每个列表中。

显然,这不是您想要的。相反,我怀疑您正在尝试进行一系列if/else的操作,其中一组行为最多涉及8或9,然后另一组行为接管了。

自从您在评论中提到else以来,我猜这是一项家庭作业或您尚未学习else的事情。

在这种情况下,您需要确保彼此之间的条件直接相反!最简单的方法是使用not。 (请注意,两个if语句的缩进量相同!第二个if不包含在第一个语句中。):

for n in ...:
    ...
    low_rebar = (n <= rebarnumber + 1)

    if low_rebar:
        Asi.append(PI_Y2_4)
        Asci.append(PI_Y2_4)
        dis.append(h - cbyby_2)
        disc.append(ctyby_2)

    if not low_rebar:
        Asi.append(PI_Y2_4)
        Asci.append(PI_Y2_4)
        dis.append(h - cbyby_2 - ca)
        disc.append(cbyby_2 + ca)

    print(disc, n)

如果您没有使用布尔表达式,则可能不习惯将结果存储在变量中。在这种情况下,您可以将其说明如下:

    if n <= rebarnumber + 1:
        ...
    if not (n <= rebarnumber + 1):
        ...

或者您可以在数学上逆转条件:

    if n > rebarnumber + 1: