Python:比较列表中条目之间的距离,如果距离小于特定数字,则替换条目?

时间:2018-05-01 02:24:00

标签: python combinations distance itertools

我已生成如下随机列表,其中每个条目对应于x,y,z坐标。然后我比较每个条目之间的距离如下:

myList = []
for x in range(12): #12 is just an example number, just a multiple of 3
    myList.append(random.uniform(0,1))
#Split list into x,y,z coordinates
n = 3
newList = [myList[i:i + n] for i in xrange(0, len(myList), n)]

#function to get distance
def distance(p1, p2):
    myDist = math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)
    return myDist

#Compare distance between each entry in newList
for a,b in itertools.combinations(newList, 2):
    distance(a,b)

我的问题是:

如果距离(a,b)< i,其中我是一些数字,我想用新条目替换a和/或b,使得距离大于i。最后,我想要一个列表,使得任意两点之间的距离都大于i。我想在这里添加一个if语句:

#Compare distance between each entry in newList
i = 0.4 #can be any number
for a,b in itertools.combinations(newList, 2):
    distance(a,b)
    if distance(a,b) < i:
        #replace a and/or b

然而,我认为我需要再次迭代newList以确保生成的所有新点都不在其他点的i距离内,并继续这样做直到所有点都大于i距离。有一个巧妙的方法来做到这一点?谢谢!

1 个答案:

答案 0 :(得分:0)

  

然而,我认为我需要再次迭代newList以确保生成的所有新点都不在其他点的i距离内,并继续这样做直到所有点都大于i距离。有一个巧妙的方法来做到这一点?谢谢!

有更简洁的方法可以做到这一点,但它们都涉及使用平衡树结构来执行2-d碰撞检测比检查每个点更快,因此检查新点是否有效只需要log(n)时间而不是n。

您可以避免生成完整的原始列表;一次生成一个点,验证它们,然后将它们添加到(最初为空)列表稍微快一点。