【问题标题】:Append list within nested for-loop在嵌套的 for 循环中追加列表
【发布时间】:2018-11-25 22:48:35
【问题描述】:

我已经定义了一些数据,这些数据会附加到一些列表中。为了做到这一点,我需要将它们放入某种嵌套循环条件中。首先创建一个 1-15 之间的范围,然后计算 rebarnumber,在循环中,我在匹配 n <= rebarnumber 时设置这些条件,*do something*,然后在 n >= rebarnumber 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

想要的结果,(仅显示最后 2 行打印)

[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

代码:

h = 300
cb = 35
ct = 35
ca = 35
b= 300
y = 12
d = h - cb
ds = ct
a = 25
yb = 8
rebarnumber = math.floor((b-(2*cb+2*yb+y))/a)
disc = []
dis = []
Asi = []
Asci = []

for n in range(1,16):
    if n <= rebarnumber+1:
        Asi.append(int(3.1416/4*(y)**2))
        dis.append( h - (cb + yb + y/2 ))
        Asci.append(int(3.1416/4*(y)**2))
        disc.append( ct + yb + y/2 )
        if n >= rebarnumber:
            Asi.append(int(3.1416/4*(y)**2))
            dis.append( h - (cb + yb + y/2 ) - ca)
            Asci.append(int(3.1416/4*(y)**2))
            disc.append( cb + yb + y/2 + ca)
    print(disc, n)

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

【问题讨论】:

  • 这取决于你想要发生什么。你展示了你不想要的东西,但没有清楚地描述你想要什么。你能显示你想要的输出吗?你试过调试吗?
  • 你说的是嵌套循环,其实只有一个循环。
  • 查看我更新的图片
  • 可能您必须将第二个 if 块取消缩进一级(并可能调整条件)。
  • 我想改变条件,否则语句不会在这里使用。但我想保持简单。

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


【解决方案1】:

您的代码中有一些尴尬的地方。让我们先把这些弄清楚。

  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)
    

    另外,在计算 disc 的值时,您确定 ctcb 吗?其他一切都保持不变,但这两个改变了。会不会是笔误?

现在,解决了这些问题,让我们看看你的“得到”与“想要”的例子。你“得到”了一堆在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:

【讨论】:

  • 您的解释和解决方案非常出色且具有教学性。这解决了我的问题等等......非常感谢您的帮助。
猜你喜欢
  • 2014-02-08
  • 2018-11-16
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多