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 = ['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
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

問題はこのコードにあります:

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

他の人はあなたのコードで何が起こっているかをすでに説明していますが、ここに別のオプションがあります...

使用しても構わない場合numpy

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

そして、行列を扱うつもりなら、おそらく見るのは悪い考えではないでしょnumpyscipy...

于 2012-10-23T19:55:05.267 に答える