2013-07-17 55 views
0

我寫了下面的代碼位插入功能:的Python:「行爲不端」的循環

... 
for x in range(len(coeff)): coeff[x].insert(0,names[x]) 
coeff.insert(0,['Center','c1','c2','c3'])  
print_matrix(coeff) 
... 

print_matrix功能只是打印從一個元組[ROW1]一個很好的矩陣,ROW2],[等等...]]。 我的coeff = [[1,2,3],[4,5,6]]和我的names = ['A,'B']

我第一次運行該功能,我得到:

coeff = [['Center','c1','c2','c3'],['A',1,2,3],[B,4,5,6]] 
+----------------------+ 
| Center c1 c2 c3 | 
| A  1 2 3 | 
| B  4 5 6 | 
+----------------------+ 

這正是我想要的。當我運行相同的(複製和粘貼)腳本只是後的第一個類似的方式打印另一張元組basis = [[7,8,9],[10,11,12]]的問題開始:

... 
del x 
for x in range(len(basis)): basis[x].insert(0,names[x]) 
basis.insert(0,['Center','A1','A2','A3'])  
print_matrix(basis) 
... 

然後我得到:

basis = [['Center','A1','A2','A3'],['A','B',7,8,9],['A','B',10,11,12]] 

和錯誤從print_matrix函數,因爲它沒有得到具有相等長度行的元組。爲什麼?

+4

不循環的指數 - 它的速度慢,難以閱讀,僵化。對於範圍內的x(len(coeff)):coeff [x] .insert(0,names [x])''變成''x,zip中的名字(coeff,names):x.insert(0,name)'' 。你也應該避免使用一行循環 - 這會使代碼更難閱讀。如果你總是插入到前,你可能想用['collections.deque'(http://docs.python.org/3.3/library/collections.html?highlight=deque#collections.deque)和''deque.appendleft()'也可以在列表和'list.insert()'上。 –

+0

@Lattyware謝謝你的語法修正。它現在更清潔,但它仍然不起作用。結果與我的環路設計完全一樣。我現在要去嘗試'deque'。 – MarcinKonowalczyk

+0

我提出的兩件事都不會改變程序的功能,它們只是更好的方式來做你正在做的事情。 –

回答

0

好吧,我的工作了。發生的事情是,在第一個地方構建的basis影響了功能。我只是給隨機數爲basis一個例子,但實際上它是(深中的代碼):

coordinates = [...,[1,2,3],...] 
coordinates[7] = [1,2,3] # Or something like that 
basis = [] 
basis.append(coordinates[7]) 
... 
basis.append(coordinates[7]) 

所以,當我在basis[0]insert(0,something),還插入的元素到basis[1]

這裏的代碼條,工程:

... 
basis_clone = [[y for y in basis[x]] for x in range(len(basis))] 
for y, name in zip(basis_clone,orbital_center_names): y.insert(0,name) 
basis_clone.insert(0,['Center','A1','A2','A3']) 
print_matrix(basis_clone) ; sleep(0.1) 
... 

給出here的方法都沒有工作,所以我不得不以克隆我做的方式的基礎。儘管如此,我仍然樂意提供更好的方法。

P.S:謝謝@Lattyware爲良好的語法幫助。