Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:比较列表中条目之间的距离,如果距离小于特定数字,则替换条目?_Python_Combinations_Distance_Itertools - Fatal编程技术网

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

Python:比较列表中条目之间的距离,如果距离小于特定数字,则替换条目?,python,combinations,distance,itertools,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

我已经生成了一个如下的随机列表,其中每个条目对应于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,其中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
#比较新列表中每个条目之间的距离
i=0.4#可以是任何数字
对于itertools.组合中的a、b(新列表,2):
距离(a、b)
如果距离(a,b)
然而,我认为我需要再次迭代newList,以确保生成的新点都不在其他点的I距离之内,并继续这样做,直到所有点之间的距离都大于I距离。有没有一个简洁的方法可以做到这一点?谢谢

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

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


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

迭代的顺序将影响您的最终答案。这是有意的吗?我的最终目标是得到一堆条目/点,其中没有一个点的距离小于我的距离。顺序仍然会影响这里的情况吗?我明白了-所以看起来最好一次生成一个点,检查这个新点与所有以前点的距离,如果距离大于I,则将其添加到列表中。目标是最终得到一组条目/点,其中没有一个点的间距小于i。