列表中浮点的Python成员身份

列表中浮点的Python成员身份,python,python-3.x,precision,Python,Python 3.x,Precision,假设我有一个具有x和y浮点数的x形式的元组列表points。检查点(v,w)与点中的某个点是否接近(欧几里德距离小于某个ε)的最简单的方法是什么 (当然,天真的方法是使用for循环进行查找。) 我主要想知道Python3的答案,但作为参考,Python2的答案也不错。使用开源库的答案也是可以接受的。就我个人而言,我会这样做: #给定点、最大距离和点 从数学导入sqrt print(list(map(lambda e:e[0])、filter(lambda x:x[1])使用“naive”for循

假设我有一个具有
x
y
浮点数的
x
形式的元组列表
points
。检查点
(v,w)
点中的某个点是否接近(欧几里德距离小于某个ε)的最简单的方法是什么

(当然,天真的方法是使用for循环进行查找。)


我主要想知道Python3的答案,但作为参考,Python2的答案也不错。使用开源库的答案也是可以接受的。

就我个人而言,我会这样做:

#给定点、最大距离和点
从数学导入sqrt

print(list(map(lambda e:e[0])、filter(lambda x:x[1])使用“naive”for循环没有什么不好的,除非您有一些特定的要求(主要是性能,或者如果您知道您将对相同的数据进行大量检查等)

一个简单的for循环清楚地显示了意图,甚至较弱的程序员也可以看到您在做什么,隐藏更复杂的语言结构背后的逻辑不是正确的方法

当然,当您决定更改距离的计算方式时,for循环应该位于函数的某个位置以及距离计算中/您可能希望在代码的其他位置使用距离函数 另外,当你只是搜索最近的点时,你不需要有距离-平方距离更容易计算

def distance_squared(point_from, point_to):
    return (point_from[0] - point_to[0]) ** 2 + (point_from[1] - point_to[1]) ** 2


def contains(points, target_point, threshold):
    threshold_squared = threshold ** 2
    for point in points:
        if distance_squared(target_point, point) <= threshold_squared:
            return True
    return False


my_points = [(1, 2), (3, 4), (5.2, 6.3), (7.4, 8.5), (9.6, 10.7), (11.8, 12.9)]
print(contains(my_points,(1,1),0)) # False
print(contains(my_points,(1,1),1)) # True
print(contains(my_points,(3,4),0)) # True
def距离的平方(点到,点到):
返回(点_从[0]-点_到[0])**2+(点_从[1]-点_到[1])**2
def包含(点、目标点、阈值):
阈值_平方=阈值**2
对于点到点:

如果距离的平方(目标点,点)这里有一种使用
numpy
的方法,尽管它不是最有效的

import numpy as np

lst = [(2, 1.5), (5, 1.6), (3.2, 4), (1, 0.9), (6.2, 3), (0.999, 0.901)]

def isclose_lst(x, arrs, tolerance=0.01):
    return [i for i in arrs if np.all(np.isclose(np.array((x[0], x[1])),\
                                      np.array((i[0], i[1])), atol=tolerance))]

isclose_lst((1.001, 0.899), lst)
# [(1, 0.9), (0.999, 0.901)]

您需要确定它接近的点还是只检查是否有?在某些情况下,我需要该点,而在其他情况下我不需要它。您可能会发现它很有用。您知道它执行速度方面的功能吗?不太清楚。它主要使用内置的
映射
过滤器
,因此我认为它尽可能快,除非您有不同的nt算法numpy数组也很好,顺便说一句,棒极了。