如何在Python中实现嵌套循环
目前我有一个程序,它会遍历一组向量坐标,并对这两个向量进行简单的数学运算。不过我想在程序里加一个循环,嵌套在另一个循环里面,这样我就能更好地控制程序的运行。以下是我现在的程序:
import operator
import numpy as np
b = 0
a = 1
for a in range(0,56):
vector1 = (int(l[b][0]),int(l[b][1]),int(l[b][2]))
vector2 = (int(l[a][0]),int(l[a][1]),int(l[a][2]))
#print vector1
#print vector2
x = vector1
y = vector2
vector3 = list(np.array(x) - np.array(y))
#print vector3
dotProduct = reduce( operator.add, map( operator.mul, vector3, vector3))
print dotProduct
a += 1
我想要的效果是,当a的值达到56并完成最后一次运算后,我希望b的值加1,同时a的值重置为0,然后重新进行运算,直到b的值增加到55为止。
期望的输出结果是:
坐标示例:
Cu 46.7176 27.1121 27.1121
Cu 43.2505 36.0618 32.4879
Cu 43.3392 36.0964 28.9236
Cu 43.2509 37.8362 27.1091
Cu 34.4872 14.1794 16.5767
Cu 34.4103 16.0364 14.3521
Cu 32.7006 14.069 14.412
我希望第一个坐标能和下面的所有坐标进行点积运算,然后再回到第一个坐标,接着用第二个坐标和下面的所有坐标进行点积运算,依此类推……
4 个回答
0
如果我理解你的问题,你有一个二维矩阵,大小是 (56, 2),也就是说它有56行和2列。对于每一行,
- 你在计算它们之间的差值,
- 然后把这个差值平方,
- 最后把所有得到的结果加起来,形成一个一维的向量。
用集合的表示法来说就是这样:
{∑({(row_1 - row_0)^2 | row_1 ∈ Matrix}) | row_0 ∈ Matrix}
因为你已经在使用numpy,所以这个解决方案非常简单直接。
[np.sum((l - row)**2) for row in l]
0
你可以用while循环来代替for循环:
b = 0
a = 0
while a <= 56 :
import operator
import numpy as np
vector1 = (int(l[b][0]), int(l[b][1]), int(l[b][2]))
vector2 = (int(l[a][0]),int(l[a][1]),int(l[a][2]))
#print vector1
#print vector2
x = vector1
y = vector2
vector3 = list(np.array(x) - np.array(y))
#print vector3
dotProduct = reduce( operator.add, map( operator.mul, vector3, vector3))
print dotProduct
if a == 56 :
b += 1
a = 0
else:
a += 1
if b == 55:
break
4
你可以使用嵌套的for循环。下面是你想要的代码:
for b in range(0, 56):
for a in range(0, 57):
3
先运行这个看看结果是什么(在你问下一个问题之前)
for b in range(56):
for a in range(57):
print "a:", a, "b:", b
对评论中问题的回答:
你可以在内层循环中使用 b
作为参数
for b in range(56):
for a in range(b+1, 57):
print "a:", a, "b:", b
你可以试着用更小的范围,这样可以在一个屏幕上看到所有结果
for b in range(6):
for a in range(b+1, 7):
print "a:", a, "b:", b
结果:
a: 1 b: 0
a: 2 b: 0
a: 3 b: 0
a: 4 b: 0
a: 5 b: 0
a: 6 b: 0
a: 2 b: 1
a: 3 b: 1
a: 4 b: 1
a: 5 b: 1
a: 6 b: 1
a: 3 b: 2
a: 4 b: 2
a: 5 b: 2
a: 6 b: 2
a: 4 b: 3
a: 5 b: 3
a: 6 b: 3
a: 5 b: 4
a: 6 b: 4
a: 6 b: 5