先进的循环

时间:2013-03-08 20:06:21

标签: python list for-loop loops

我有一份清单清单(最后一个清单并不重要)

data = [[[['f', 0], 'C'], [['X', 0], 'X']],
[[['s', 1], 'X'], [['X', 0], 'X']]]

它本质上是一个有4个象限的地图。目前我正在迭代它并用

更新它
for i in data:
    for x in i:
        if x[0][0] == 'f':
            x[0][1] += 1

但我想检查一个小区的邻居。有没有办法做到这一点,当迭代这个或我必须解决通过整数键移动列表?

2 个答案:

答案 0 :(得分:4)

是的,除非你写一些更复杂的东西,允许你迭代那些也给你邻居的元素,你将不得不使用元素的绝对寻址。

如果您确定始终使用列表列表(即不仅仅是其他可迭代列表),您当然可以使用enumerate来获取索引元素本身很快:

for i, row in enumerate(data):
    for j, cell in enumerate(row):
        # now you can access data[i][j-1], data[i+1][j] etc

所以,我首先提到“更复杂”的东西,你可以做的是制作一个自动迭代单元格的生成器,返回附加数据,例如左邻居或其他东西。

def myLeftNeighborGenerator(data):
    for i, row in enumerate(data):
        for j, cell in enumerate(row):
            leftNeighbor = data[i][j-1] if j > 0 else None
            yield cell, leftNeighbor

然后您可以使用该生成器神奇地获取数据:

for x, left in myLeftNeighborGenerator(data):
    if x[0][0] == 'f':
        x[0][1] += 1
    if left is not None:
        # whatever

答案 1 :(得分:2)

如果您不想担心必须自己跟踪整数键,但仍想使用它们,则python具有built in function enumerate

>>> for index, value in enumerate(['my','list','of','stuff']):
...    print index, value
0 my
1 list
2 of
3 stuff

enumerate函数在for循环的每次迭代中将项目的索引与该项目配对。