1

我有一个列表列表(最后一个列表并不重要)

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

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

4

2 回答 2

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
于 2013-03-08T20:21:49.333 回答
2

如果不想担心必须自己跟踪整数键,但仍想使用它们,python 有内置函数enumerate

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

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

于 2013-03-08T20:16:31.797 回答