Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用生成器构建矩阵_Python_Generator - Fatal编程技术网

Python 用生成器构建矩阵

Python 用生成器构建矩阵,python,generator,Python,Generator,我有一份清单: l = [1,2,3] 我希望我的输出是: m = [(1-1, 1-2, 1-3),(2-1, 2-2, 2-3), (3-1, 3-2, 3-3)] m = [[0, -1, -2], [1,0,-1], [-2,-1,0]] 我编写了这个函数,它工作得很好: def matrixer(l): matrix = [] for data in l: column = [] column.append(data - l[0])

我有一份清单:

l = [1,2,3]
我希望我的输出是:

m = [(1-1, 1-2, 1-3),(2-1, 2-2, 2-3), (3-1, 3-2, 3-3)]
m = [[0, -1, -2], [1,0,-1], [-2,-1,0]]
我编写了这个函数,它工作得很好:

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循环,但由于遇到了相同的问题,我没有完全达到目的。

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

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\u答案

l = [1,2,3]
answer = []
for each in l:
  answer.append([each-x for x in l])
print(answer)
#[[0, -1, -2], [1, 0, -1], [2, 1, 0]]
l
可缩放。我们在列表中进行迭代,然后在使用列表理解创建的新列表的后面添加一个新的列表,我们通过再次遍历列表来减去
每个
变量

如果我们将
l
更改为
l=[1,2,3,4,5,6,7]
我们得到:

[[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不是-2…而是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循环更具可读性。

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

def matrixer(l):
    return [[e - d for d in l] for e in l]
  • 用于创建内线的内部listcomp
  • 使用外部listcomp创建行
输入结果:

[[0, -1, -2], [1, 0, -1], [2, 1, 0]]
列表理解是高度优化的内存理解(更少的重新分配)和CPU理解(更少的指令),因此用两个嵌套的列表理解替换双循环+附加将大大加快代码的速度。

简短的回答(迄今为止最短的^^^)是:

l = [1, 2, 3]

m = [[row - col for row in l] for col in l]
这将使用。

您可以与以下内容一起使用:

[map(operator.sub, [item]*len(l), l) for item in l]
这相当于:

matrix = []

for item in l:
    matrix.append(map(operator.sub, [item]*len(l), l))
说明:

>>> import operator
>>>
>>> l = [1, 2, 3]
>>> [map(operator.sub, [item]*len(l), l) for item in l]
[[0, -1, -2], [1, 0, -1], [2, 1, 0]]
对于
l
中的每个
,我们构建一个列表
[item]*len(l)
,并使用
map()
操作符
来获得这两个列表的减法。对于
l
中的第一个元素,即1,我们有:

[1]*3  # => [1, 1, 1]
然后:

输出:

>>> import operator
>>>
>>> l = [1, 2, 3]
>>> [map(operator.sub, [item]*len(l), l) for item in l]
[[0, -1, -2], [1, 0, -1], [2, 1, 0]]