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]]