将一对元组与元组对列表进行比较

时间:2017-11-01 16:36:39

标签: python list tuples python-3.6

所以我正在编写这个编程作业,我目前只是将一个元组中的值对与列表中的元组对进行比较。

这些对基本上是x和y坐标,我需要找到从列表到元组对中最接近的一对。例如,给定点(-4, 3)和列表[(10, 6), (1, 7), (6, 3), (1, 9)],最接近的点是(1, 7)

这些数字总是随编程的随机部分而变化,但上面的定义为函数。以下是整个事情:

def nearest(point, more_points):
    '''
    Finds the nearest point to the base point
    '''
    (x, y) = point
    for i, j in more_points:
        a = math.fabs(x - i)
        tempI = i
        b = math.fabs(y - j)
        tempJ = j
        tempA, tempB = a , b
        if min(tempA) <  a:

point = () 
my_points = []
c = 0
lpoint = list(point)
while c < 2:
     lpoint.append(random.randrange(-5,5,1)) # generate the "point"
     c += 1
tpoint = tuple(lpoint)
c = 0
colx = [] # x points
coly = [] # y points
# generate the points
while c < 4:
    colx.append(random.randint(0,10))
    coly.append(random.randint(0,10))
    c += 1

my_point = list(zip(colx,coly))
print(my_point)
the_nearest = nearest(tpoint,my_point)
print(the_nearest)

我要做的是将x,y取在点上,然后选择&#34;其他&#34;指向并获得差异,然后使用它来找到&#34;最近的&#34;但我迷路了,我被困住了。重点是用户定义的功能。

2 个答案:

答案 0 :(得分:5)

假设以下函数计算2点内的距离:

def distance(point_a, point_b):
    """Returns the distance between two points."""
    x0, y0 = point_a
    x1, y1 = point_b
    return math.fabs(x0 - x1) + math.fabs(y0 - y1)

您可以迭代所有点并找到最小距离:

def nearest(point, all_points):
    closest_point, best_distance = None, float("inf")
    for other_point in all_points:
        d = distance(point, other_point)
        if d < best_distance:
             closest_point, best_distance = other_point, d
    return closest_point

虽然我可以想出一个更加pythonic的方法:

def nearest(point, all_points):
    """Returns the closest point in all_points from the first parameter."""
    distance_from_point = functools.partial(distance, point)
    return min(all_points, key=distance_from_point)

上述解决方案的总体思路是构建部分功能。此部分函数采用单个参数并返回到作为参数给定的点的距离。这可以重写为lambda other_point: distance(point, other_point),但这更漂亮。

请注意,如果您使用空列表列表调用ValueError,则上述函数将引发nearest(point, [])<MyFile> <Body> <Data> <row AW="1" AX="SPC" AY="011" AZ="" BA="5" BB="38.482" /> <row AW="2" AX="CDR" AY="011" AZ="" BA="8" BB="39.812" /> <row AW="3" AX="FFD" AY="011" AZ="" BA="9" BB="41.115" /> </Data> </Body> 。如有必要,您可以为此案例添加if。

答案 1 :(得分:0)

min()key功能一起使用:

#!/usr/bin/env python3

import math
from functools import partial


def distance_between_points(a, b):
    ax, ay = a
    bx, by = b
    return math.sqrt(pow(ax - bx, 2) + pow(ay - by, 2))


def nearest(point, more_points):
    '''
    Finds the nearest point to the base point
    '''
    distance_to_point = partial(distance_between_points, point)
    return min(more_points, key=distance_to_point)


point = (-4, 3)
my_points = [(10, 6), (1, 7), (6, 3), (1, 9)]
n = nearest(point, my_points)
print(n)