2012-10-23 41 views
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
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']] 
+0

所以這就是問題!謝謝!我很困惑! – Atticus29

+0

我知道 - 這可能會讓Python感到困惑。與C++不同,在Python中分配對象會創建對現有對象的引用 - 而不是bitcopy。對於簡單的列表,切片是方法;對於更復雜的情況,請使用模塊**副本** – volcano

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']] 
+0

ISWYDT。謝謝!不告訴我我的問題,但非常經濟和清晰。謝謝! – Atticus29

1

問題withing驗證碼:

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[:]) 
1

您需要爲矩陣中的每一行創建一個獨立元素的新行。做matrix.append(rows)只會一次又一次地插入對同一個列表實例的引用。

改爲嘗試matrix.append(list(rows))

對於更復雜的情況,copy模塊可能會有所幫助。

問題的根源在於Python只處理對象實例的引用,它沒有像C中那樣的「變量」的概念,所以在做任務時沒有複製對象。相反,這只是一個新的參考。

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

matrix = [['' if i!=j else source[i] for i in range(len(source))] 
    for j in range(len(source))] 
1

其他人已經解釋什麼是你的代碼發生,但這裏的另一個選項...

如果你不介意使用numpy則:

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

如果你是將要處理矩陣然後它可能不是一個壞主意,看看numpyscipy無論如何...