1

次の 2 つのコード セグメントは本質的に同等であると予想しました。

return tuple(tuple( False if (i,j) in neighborhood else avail[i][j]
    for i in range(len(avail)))     
    for j in range(len(avail[i])))

(False, False, True, True, True)
(False, False, True, True, True)
(False, False, True, True, True)
(False, False, True, True, True)
(True, True, True, True, True)

ls = [[val for val in row] for row in avail]
for i in range(len(avail)):
    for j in range(len(avail[i])):
        if (i,j) in neighborhood:
            ls[i][j] = False
return ls

[False, False, False, False, True]
[False, False, False, False, True]
[True, True, True, True, True]
[True, True, True, True, True]
[True, True, True, True, True]

forループを使用したものは「正しい」です(それが私が望んでいたことです)。リストの理解バージョンがインデックスを交換したのはなぜですか?

4

1 に答える 1

1

最初のバージョンではループが反転しています。range(len(avail))ループする内側のタプルと、ループする外側のタプルを作成していますrange(len(avail[i]))

あなたのコードは、代わりにこれと同等です(タプルの代わりにリストを使用):

outer = []
for j in range(len(avail[i])):
    inner = []
    for i in range(len(avail)):
        inner.append(False if (i,j) in neighborhood else avail[i][j])
    outer.append(inner)

iグローバルとして割り当てられていることに依存していました。括弧に基づいて式をインデントすると、これも確認できます。

return tuple(
    tuple(
        False if (i,j) in neighborhood else avail[i][j]
        for i in range(len(avail))
    )     
    for j in range(len(avail[i]))
)

ループを逆にします (グループ化をよりよく伝えるために別の方法でインデントします)。

return tuple(
    tuple(False if (i,j) in neighborhood else avail[i][j] for j in range(len(avail[i])))     
    for i in range(len(avail)))

上記は次と同等です。

outer = []
for i in range(len(avail)):
    inner = []
    for j in range(len(avail[i])):
        inner.append(False if (i,j) in neighborhood else avail[i][j])
    outer.append(inner)

を使用してコードを簡素化できますenumerate()

return tuple(
    tuple(False if (i,j) in neighborhood else v for j, v in enumerate(row))    
    for i, row in enumerate(avail))
于 2013-08-07T13:14:38.980 に答える