我有输入文件,
Node ID X Y
1 5 10
2 8 20
3 9 5
4 7 10
第一列显示节点ID,第二列和第三列分别显示X和Y坐标。如何找到另一个节点之间的距离?
答案 0 :(得分:1)
首先创建字典crd
crd = {}
然后你应该使用readlines阅读你的文件。 在我的情况下,我使用你的原始文本,我使用字符串函数拆分将其分成几行(虽然我认为必须有更好的方法来做到这一点)
for line in a.split('\n'):
m = map(int,line.split())
crd[m[0]] = m[1:]
crd
{1: [5, 10], 2: [8, 20], 3: [9, 5], 4: [3, 10]}
最后,以免计算距离
from math import sqrt
dist = lambda d,x,y: sqrt((d[x][0]-d[y][0])**2 + (d[x][1]-d[y][1])**2)
dist(crd,1,2)
10.44030650891055
更新: 如果你需要我建议的所有组合
for i in sorted(crd.keys()):
for j in sorted(crd.keys()):
if j>i:
print i,j,':',dist(crd,i,j)
1 2 : 10.4403065089
1 3 : 6.40312423743
1 4 : 2.0
2 3 : 15.0332963784
2 4 : 11.1803398875
3 4 : 7.81024967591
答案 1 :(得分:0)
首先将数据读入列表列表然后调用函数。
with open("file.txt","r") as f:
a = [map(int,l.split()) for l in f if l.split()]
dist(a)
a
[[1, 5, 10], [2, 8, 20], [3, 9, 5], [4, 3, 10]]
然后通过使用 itertools combinations()
函数,您将获得所有节点对。
def dist(data):
comb = list(combinations([b[0] for b in data],2))
comb
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
然后是遍历列表并获取输入点的问题
for (x,y) in comb:
x1 = data[x-1][1]
x2 = data[y-1][1]
y1 = data[x-1][2]
y2 = data[y-1][2]
d = sqrt((x2-x1)**2 + (y2-y1)**2)
print "{}-{} dis = {}".format(x,y,d)
哪个输出:
1-2 dis = 10.4403065089
1-3 dis = 6.40312423743
1-4 dis = 2.0
2-3 dis = 15.0332963784
2-4 dis = 11.1803398875
3-4 dis = 7.81024967591