您可以實現這一點相當簡單。
使用向量邏輯以比較兩點:
def fuzzy_eq(A, B):
EPS = 0.01
# first, find a delta between two points
x = A[0] - B[0]
y = A[1] - B[1]
z = A[2] - B[2]
# next, find the length of that delta
length = sqrt(x*x + y*y + z*z)
# finally, check the length
return length < EPS:
但它會更容易一些3D矢量圖庫很多:
def fuzzy_eq(A, B):
EPS = 0.01
# assuming A and B are of some 3D vector class
length = (A-B).length()
return length < EPS
實現的,而不是in
運營商自己的函數:
def fuzzy_in(coords, X):
return any(fuzzy_eq(coord, X) for coord in coords)
fuzzy_in(coordinates, G)
要用你的方式使用in
操作符,你應該子集(或其他類似容器),並覆蓋__contains__
方法:
class Coordinates(set):
def __contains__(self, value):
return fuzzy_in(self, value)
此外,作爲@ user2357112指出的那樣,你可能不需要這種情況下的組。
如果你的目標是速度,而你已經有問題,你應該使用其他語言。或者一些使用C的快速庫,例如,它可以處理較慢的部分。
「因爲我知道如何用for循環做這件事,但in運算符非常快」 - 帶有集合的'in'基於散列表查找,這對於查找附近的點不起作用。如果這是你想要做的,那麼一組可能不是一個合適的數據結構。 – user2357112
'in'快速取決於你使用它的方式;你可以爲*語法*實現'__contains__',但它可能仍然有相同的循環內部。 – jonrsharpe
你很可能想要寫一個函數來確定點是否在座標中,比如'isXinY = lambda x,y:any([((x [0] -i [0])** 2 +(x [1] -i [1])** 2+(x [2] -i [2])** 2)** 0.5 < for i in y])' –
victor