gpt4 book ai didi

python - 为什么嵌套列表索引与列表推导式交换?

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:08 25 4
gpt4 key购买 nike

我预计以下 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 循环的那个是“正确的”(这就是我想要的)。为什么列表理解版本交换索引?

最佳答案

你的循环在第一个版本中被颠倒了。您正在创建在 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))

关于python - 为什么嵌套列表索引与列表推导式交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18104338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com