【问题标题】:Python: If in a For LoopPython:如果在 For 循环中
【发布时间】:2012-06-13 17:31:43
【问题描述】:

我正在创建一个包含坐标和 ID 编号的文件列表。
a 只是一个用于分隔点的任意值。 f 是一个较早打开和较晚关闭的文件。 我正在使用下面列出的代码。它应该产生 511 个点,跳过一个原本是第 293 个点的点。相反,它跳过了 169 分,我不知道为什么。对此的任何帮助将不胜感激。

id=1

for i in range(0,8,1):
    for j in range(0,8,1):
        for k in range(0,8,1):
            x1=i*a
            y1=j*a
            z1=k*a
            if ((i!=4) & (j!=4) & (k!=4)):
                f.write("%4.d  1  4  %4.3f  %4.3f  %4.3f\n"%(id, x1, y1, z1))
                id=id+1

【问题讨论】:

  • @David -- f 也是 -- 你可以猜到它们是什么。

标签: python loops if-statement for-loop


【解决方案1】:

由于您要求i 必须不同于4 并且j 必须不同于4 并且k 必须不同于4,因此您将跳过其中任何一个点4。使用

if i != 4 or j != 4 or k != 4:

相反。等效地,但可能更容易掌握,你可以写

if not (i == 4 and j == 4 and k == 4):

甚至更好

if i, j, k != 4, 4, 4:

编辑:这是完全重写的代码版本:

points = itertools.product(range(0, 8 * a, a), repeat=3)
points = (p for p in points if p != (4 * a, 4 * a, 4 * a))
with open("filename", "w") as f:
    for id_p in enumerate(points, 1):
        f.write("%4.d  1  4  %4.3f  %4.3f  %4.3f\n" % id_p)

【讨论】:

    【解决方案2】:

    你的条件是错误的,应该有'or'而不是'and'。另外,你的代码可以稍微简化一下,应该是这样的:

    for i in range(8):
        for j in range(8):
            for k in range(8):
                x1 = i * a
                y1 = j * a
                z1 = k * a
                if i != 4 or j != 4 or k != 4:
                    print("%4.d  1  4  %4.3f  %4.3f  %4.3f\n" % (id, x1, y1, z1))
                    id += 1
    

    【讨论】:

    • 可以再简化一点:range(0,8) -> range(8)
    猜你喜欢
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多