我怎样才能在 python 中一次干净地遍历多个 2d 列表?

新手上路,请多包涵

例如,如果我正在制作一个简单的基于网格的游戏,我可能会有一些二维列表。一个可能用于地形,另一个可能用于物体等。不幸的是,当我需要遍历列表并让一个列表中的正方形内容影响另一个列表的一部分时,我必须做这样的事情。

 for i in range(len(alist)):
    for j in range(len(alist[i])):
        if alist[i][j].isWhatever:
            blist[i][j].doSomething()

有没有更好的方法来做这样的事情?

原文由 Eugene M 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 958
2 个回答

我将从编写一个生成器方法开始:

 def grid_objects(alist, blist):
    for i in range(len(alist)):
        for j in range(len(alist[i])):
            yield(alist[i][j], blist[i][j])

然后,每当您需要遍历列表时,您的代码如下所示:

 for (a, b) in grid_objects(alist, blist):
    if a.is_whatever():
        b.do_something()

原文由 Robert Rossney 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果有人对上述解决方案的性能感兴趣,这里是针对 4000x4000 网格的,从最快到最慢:

编辑:添加 Brian 的分数 izip 修改,它赢了很多!

John 的解决方案也非常快,尽管它使用索引(看到这个我真的很惊讶!),而 Robert 和 Brian 的(使用 zip )比问题创建者的初始解决方案慢。

因此,让我们展示 Brian 的获胜函数,因为它在该线程的任何地方都没有以正确的形式显示:

 from itertools import izip
for a_row,b_row in izip(alist, blist):
    for a_item, b_item in izip(a_row,b_row):
        if a_item.isWhatever:
            b_item.doSomething()

原文由 Dzinx 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题