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

はい、隣接する要素も提供する要素を反復処理できる、より複雑なものを作成しない限り、要素の絶対アドレス指定を使用する必要があります。

リストのリストを常に使用することが確実な場合 (つまり、他の iterable だけでなく)、 を使用し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 に答える