问题描述
我需要列出一个已创建的列表,找到最接近的两个点并将其打印出来.如何比较列表中的每个点?
I need to take a list I have created and find the closest two points and print them out. How can I go about comparing each point in the list?
不需要绘图或任何东西,只需比较点并在列表中找到最接近的两个点即可.
There isn't any need to plot or anything, just compare the points and find the closest two in the list.
import math # 'math' needed for 'sqrt'
# Distance function
def distance(xi,xii,yi,yii):
sq1 = (xi-xii)*(xi-xii)
sq2 = (yi-yii)*(yi-yii)
return math.sqrt(sq1 + sq2)
# Run through input and reorder in [(x, y), (x,y) ...] format
oInput = ["9.5 7.5", "10.2 19.1", "9.7 10.2"] # Original input list (entered by spacing the two points).
mInput = [] # Manipulated list
fList = [] # Final list
for o in oInput:
mInput = o.split()
x,y = float(mInput[0]), float(mInput[1])
fList += [(x, y)] # outputs [(9.5, 7.5), (10.2, 19.1), (9.7, 10.2)]
推荐答案
使用两个(x, y)
元组作为参数来重写distance()
函数更方便:
It is more convenient to rewrite your distance()
function to take two (x, y)
tuples as parameters:
def distance(p0, p1):
return math.sqrt((p0[0] - p1[0])**2 + (p0[1] - p1[1])**2)
现在,您要遍历列表fList
中的所有对点.函数iterools.combinations()
用于此目的很方便:
Now you want to iterate over all pairs of points from your list fList
. The function iterools.combinations()
is handy for this purpose:
min_distance = distance(fList[0], fList[1])
for p0, p1 in itertools.combinations(fList, 2):
min_distance = min(min_distance, distance(p0, p1))
另一种方法是定义distance()
以接受单个参数中的成对点
An alternative is to define distance()
to accept the pair of points in a single parameter
def distance(points):
p0, p1 = points
return math.sqrt((p0[0] - p1[0])**2 + (p0[1] - p1[1])**2)
,然后将key
参数用于内置的min()
函数:
and use the key
parameter to the built-in min()
function:
min_pair = min(itertools.combinations(fList, 2), key=distance)
min_distance = distance(min_pair)
这篇关于列表中两点之间的距离公式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!