<p>你的代码很难阅读,这就模糊了你要做的事情。对于四个位置,您需要(4 x(4-1))/2=6个距离,但是随着位置计数的增加,数量迅速增加。在这里,我退出并计算出完整的4x4距离矩阵-很明显,我做了一些多余的工作,你可以消除这些工作。在</p>
<p>您的下标使您很难理解发生了什么,因此我在<code>for</code>循环中使用解包赋值来避免它,并将数据的每个元素绑定到一个名称。在</p>
<pre><code>import math
places = [
["Millersville", "CA", 35.303850, -118.457860], #(city 1)
["Millersville", "IL", 39.451150, -89.158140 ], #(city 2)
["Millersville", "IN", 39.853100, -86.091650 ], #(city 3)
["Millersville", "MD", 39.059550, -76.648020 ] #(city 4)
]
# One of the minus signs was weird
radius = 6371 # Mean radius in Km
distances = []
for nameA, stateA, latA, longA in places:
dists_row = []
for nameB, stateB, latB, longB in places:
dlat = math.radians(latA-latB)
dlon = math.radians(longA-longB)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(latA)) \
* math.cos(math.radians(latB)) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = radius * c
distance = d * 0.621371
dists_row.append(distance)
distances.append(dists_row)
for row in distances:
print(row)
</code></pre>
<p>这个打印出来了</p>
^{pr2}$
<p>这是很好的对称和令人放心的零在对角线,这意味着我可能没有把你的公式,因为我重写他们。这是一个打印结果而不是存储在矩阵中的版本。在这一次,我只计算一次每个距离。在</p>
<pre><code>radius = 6371 # Mean radius in Km
for stnum, (nameA, stateA, latA, longA) in enumerate(places):
for nameB, stateB, latB, longB in places[stnum+1:]:
dlat = math.radians(latA-latB)
dlon = math.radians(longA-longB)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(latA)) \
* math.cos(math.radians(latB)) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = radius * c
distance = d * 0.621371
print(nameA, stateA, "to", nameB, stateB, "is", distance, "miles")
</code></pre>
<p>从中输出</p>
<pre><code>Millersville CA to Millersville IL is 1626.6140655454842 miles
Millersville CA to Millersville IN is 1789.8845362720158 miles
Millersville CA to Millersville MD is 2295.8829666956335 miles
Millersville IL to Millersville IN is 165.46706149552824 miles
Millersville IL to Millersville MD is 669.3166714199295 miles
Millersville IN to Millersville MD is 506.5281329453448 miles
</code></pre>