我希望以下两个代码段基本相同。
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循环的那个是"正确" (这就是我想要的)。为什么list comprehension-version会交换索引?
答案 0 :(得分: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))