Python-有效检查列表中的每个项目与其他所有项目

时间:2018-08-02 20:16:24

标签: python python-3.x list for-loop

我正在开发一个游戏,其中每个对象都应检查它是否与任何其他对象发生碰撞。我有一个所有对象的清单,还有一个函数可以确定两个对象是否碰撞并销毁它们。我当前使用的方法效率很低。

for i in list1:
    for j in list1:
        if collide(i, j):
            i.kill()
            j.kill()

最初,两个对象被杀死后,我将它们从列表中删除,但是发生了一些碰撞,但没有检测到,因此我恢复了此代码。可以,但是我想要更有效的方法。

1 个答案:

答案 0 :(得分:1)

首先,这要测试两次,并且还要测试一个对象是否与自身碰撞:

for i in list1:
    for j in list1:
        if collide(i, j):
            i.kill()
            j.kill()

这恰好循环len(list1)**2次。

一种非常简单的方法将测试次数除以2(并避免针对自身进行测试):

for i,obj1 in enumerate(list1):
   for j in range(i+1,len(list1)):
      obj2 = list1[j]
      if collide(obj1,obj2):
         obj1.kill()
         obj2.kill()

利用collide(obj1,obj2)collide(obj2,obj1)相同的事实。

这时,由于obj1现在已死,您可能想break退出内部循环。但这取决于您想做什么。

如果准确的碰撞测试价格昂贵,则可以考虑进行更粗略的检查(距离,矩形边界,任何快速方法),因此可以丢弃彼此相距太远的项目而无需执行“昂贵”的测试。 / p>