1

我正在尝试使用以下代码在 python 中填充空矩阵(列表列表)的对角线:

source=['a','b','c']

rows=[]
for x in source:
    rows.append('')
matrix=[]
for x in source:
    matrix.append(rows)

print "before populating", matrix

for x in range (0, len(source)):
    matrix[x][x]=source[x]

print "after populating", matrix

我意识到这不是完成此任务的最有效方法,但这实际上似乎是我遇到的最少的问题。

我得到的输出是这样的:

[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]

但我希望的输出是这样的:

[['a', '', ''], ['', 'b', ''], ['', '', 'c']]

知道出了什么问题吗?非常感谢!

4

6 回答 6

4
for x in source:
    matrix.append(rows)

您使用对rows的引用填充矩阵。您可以使用切片来制作副本

>> rows = ['a','b','c']
>>> matrix = [rows[:] for _ in range(len(rows))]
>>> matrix
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
>>> matrix[1][1]=' '
>>> matrix
[['a', 'b', 'c'], ['a', ' ', 'c'], ['a', 'b', 'c']]
于 2012-10-23T19:44:00.907 回答
2

一个简单的列表理解应该做到这一点:

In [62]: source=['a','b','c']

In [63]: [[""]*i + [x] + [""]*(len(source)-i-1) for i,x in enumerate(source)]
Out[63]: [['a', '', ''], ['', 'b', ''], ['', '', 'c']]

In [64]: source=['a','b','c','d']

In [65]: [[""]*i + [x] + [""]*(len(source)-i-1) for i,x in enumerate(source)]
Out[65]: [['a', '', '', ''], ['', 'b', '', ''], ['', '', 'c', ''], ['', '', '', 'd']]
于 2012-10-23T19:44:08.657 回答
1

问题在于这段代码:

rows=[]
for x in source:
    rows.append('')
matrix=[]
for x in source:
    matrix.append(rows)

您每次都提供相同的参考。

for x in range (0, len(source)):
    matrix[x][x]=source[x]

这将修改同一个对象。解决方案:使用副本:

matrix=[]
for x in source:
    # use a copy.
    matrix.append(rows[:])
于 2012-10-23T19:46:33.810 回答
1

您需要为矩阵中的每一行创建一个新的独立元素行。这样做matrix.append(rows)只会一次又一次地插入对同一列表实例的引用。

试试matrix.append(list(rows))吧。

对于更复杂的情况,该copy模块可能会有所帮助。

问题的根本原因在于 Python 只处理对对象实例的引用,它没有像 C 中那样的“变量”概念,因此在进行赋值时不会复制对象。相反,只有一个新的参考。

于 2012-10-23T19:47:03.343 回答
1
source=['a','b','c']

matrix = [['' if i!=j else source[i] for i in range(len(source))]
     for j in range(len(source))]
于 2012-10-23T19:49:06.657 回答
1

其他人已经解释了您的代码发生了什么,但这是另一种选择......

如果您不介意使用numpy然后:

import numpy as np
np.diag(['a', 'b', 'c']).tolist()
# [['a', '', ''], ['', 'b', ''], ['', '', 'c']]

And if you're going to be dealing with matrices then it's probably not a bad idea to look at numpy or scipy anyway...

于 2012-10-23T19:55:05.267 回答