首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python -高效地检查列表中的每一项

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

Stack Overflow用户
提问于 2018-08-03 04:16:24
回答 1查看 753关注 0票数 0

我正在做一个游戏,其中每个物体都应该检查它是否与任何其他物体发生碰撞。我有一个所有对象的列表和一个函数,该函数可以确定两个对象是否发生碰撞并销毁它们。我目前使用的方法效率非常低。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-03 04:31:24

首先,这是两次过多的测试,也是测试一个对象是否与自身发生碰撞:

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现在已经死了。但这取决于你想做什么。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51661522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档