gpt4 book ai didi

python - 重新排序列表理解中的语句时出现 NameError

转载 作者:行者123 更新时间:2023-11-28 19:54:09 26 4
gpt4 key购买 nike

我正在学习列表理解,通过切换变量我得到了 2 个不同的结果,尽管它们看起来应该工作相同。

数组 a 等于 [[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 0, 0, 0 , 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

列表理解1作品:

[(i,j) for j in range(len(a[i])) for i in range(len(a))] 

返回:

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]

正如预期的那样。

但是翻转变量...

[(j,i) for i in range(len(a[j])) for j in range(len(a))]

导致 NameError:name 'j' is not defined

有人可以向我解释为什么 i 或 j 在前很重要吗?

最佳答案

当你有双 for在单个列表理解中循环它等同于执行那些 for使用“传统”以相同顺序循环 for循环。所以

result = [(j,i) for i in range(len(a[j])) for j in range(len(a))]

(几乎完全)等同于

result = []
for i in range(len(a[j])):
for j in range(len(a)):
result.append((j, i))

如您所见,当您执行 len(a[j])变量 j不存在,这就是你得到 NameError 的原因.

顺便说一句,您的第一个列表组合也不应该起作用。我怀疑您已经定义了 i在你的代码前面,这就是为什么你没有得到 NameError .这是该列表 comp 的略微改进版本,它假定 a是一个矩阵,即它的所有子列表长度相同,并且它至少包含一个子列表。

[(i,j) for j in range(len(a[0])) for i in range(len(a))]

我们还可以

[(j, i) for i in range(len(a)) for j in range(len(a[0]))]

这两个列表组合创建了这个列表:

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]

关于python - 重新排序列表理解中的语句时出现 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785299/

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