代码之家  ›  专栏  ›  技术社区  ›  Aeolus

Python-有效地检查列表中的每一项

  •  0
  • Aeolus  · 技术社区  · 6 年前

    我在做一个游戏,每个物体都应该检查是否与其他物体相撞。我有一个所有对象的单一列表和一个函数,可以确定两个对象是否碰撞并销毁它们。我现在使用的方法效率很低。

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

    最初,在两个对象被杀死后,我将它们从列表中删除,但是在没有检测到的情况下发生了一些冲突,所以我返回到这段代码。它能用,但我想要更有效的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jean-François Fabre Darshan Ambre    6 年前

    首先,这是两次过多的测试,同时还测试一个对象是否与自身碰撞:

    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) .

    在这一点上,你可能想 break 因为obj1已经死了。但这取决于你想做什么。

    如果一个精确的碰撞测试是昂贵的,你可以考虑一个粗略的检查(距离,矩形边界,任何快速的方法),这样你就可以丢弃彼此太远的项目,而不需要执行“昂贵的”测试。