用Gen构建矩阵

2024-09-29 20:30:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份清单:

l = [1,2,3]

我希望我的输出是:

^{pr2}$

我编写了这个函数,它运行得很好:

def matrixer(l):
    matrix = []

    for data in l:
        column = []
        column.append(data - l[0])
        column.append(data - l[1])
        column.append(data - l[2])
        matrix.append(column)

    return matrix

但这并不能很好地扩展,因为我的列表最多可以有100个值,我不想继续为列表中的每个值添加下面的代码行:

column.append(data - l[n])

我以前从未使用过发电机,但听起来解决方案可能需要一个。我一直在尝试一个while循环,但由于遇到了相同的问题,它并不能让我达到目的。在


Tags: 函数代码in列表fordatareturndef
3条回答

双列表理解可以在一行中完成:

def matrixer(l):
    return [[e - d for d in l] for e in l]
  • 创建内线的inner listcomp
  • 创建行的外部listcomp

输入结果:

^{pr2}$

列表理解是高度优化的内存方面(更少的重新分配)和CPU方面的(更少的指令),所以用2个嵌套的列表理解代替你的双循环+append将大大提高你的代码速度。在

使用两个for循环,我们必须每次重置sub_answer。这看起来很混乱,所以可能还有另一个选择;可以在下面找到:

l = [1,2,3]
answer = []
for each in l:
  sub_answer = []
  for every in l:
    sub_answer.append(each-every)
  answer.append(sub_answer)
  sub_answer = []
print(answer)
#[[0, -1, -2], [1, 0, -1], [2, 1, 0]]

移除用于列表理解的for循环。现在我们不需要sub_answer

^{pr2}$

l是可缩放的。我们迭代列表,然后将其附加到使用列表理解创建的新列表中,我们通过再次遍历列表来减去each变量。在

{cd6>如果我们变成{cd6}:

[[0, -1, -2, -3, -4, -5, -6], [1, 0, -1, -2, -3, -4, -5], [2, 1, 0, -1, -2, -3, -4], [3, 2, 1, 0, -1, -2, -3], [4, 3, 2, 1, 0, -1, -2], [5, 4, 3, 2, 1, 0, -1], [6, 5, 4, 3, 2, 1, 0]]

作为注释(3-1 is not -2... it's 2....)


我们用一个列表理解为什么不用两个?!?!?!: 如果不需要for循环而只想使用列表理解:

l = [1,2,3]
print([[each-x for x in l] for each in l])
#[[0, -1, -2], [1, 0, -1], [2, 1, 0]]

给出了相同的结果,但我认为如果您正在学习或在团队中学习,for循环更具可读性。在

简短的回答(目前为止最短的)是:

l = [1, 2, 3]

m = [[row - col for row in l] for col in l]

它使用list comprehension。在

相关问题 更多 >

    热门问题