2012-11-14 31 views
1
_R = [0] * 5 
R = [_R] * 4 

num_user = 0 
num_item = 0 

for i in range(8): 
    s = input().split() 
    for j in range(4): 
     s[j] = int(s[j]) 

    R[s[0]][s[1]] = s[2] 
    print(s[0], s[1], R[s[0]][s[1]]) 
    num_user = max(num_user, s[0]) 
    num_item = max(num_item, s[1]) 

print("=====") 

for i in range(num_user + 1): 
    for j in range(num_item + 1): 
     print(i, j, R[i][j]) 

exit() 

大概你已經明白我要問什麼了。輸出使我困惑:Python 2D數組無法工作。幫助〜

#output 
1 2 3 
2 4 2 
1 1 5 
3 2 2 
2 2 1 
3 3 4 
1 4 3 
2 1 4 
===== 
0 0 0 
0 1 4 
0 2 1 
0 3 4 
0 4 3 
1 0 0 
1 1 4 
1 2 1 
1 3 4 
1 4 3 
2 0 0 
2 1 4 
2 2 1 
2 3 4 
2 4 3 
3 0 0 
3 1 4 
3 2 1 
3 3 4 
3 4 3 

我怎麼了?上次我用Python編碼的時候是2.7,而且很久以前。我忘了任何重要的語法嗎?

回答

2

你創造了錯誤的方式名單列表:

>>> _R = [0] * 5 
>>> R = [_R] * 4 
>>> [id(x) for x in R] #here all objects are acually identical 
[36635392, 36635392, 36635392, 36635392] 

>>> R[0][1]=1   #changing one element changes all other elements as well 
>>> R 
[[0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0]] 

更好用這種方式創建你的清單:

>>> R=[[0]*5 for _ in range(4) ] 
>>> [id(x) for x in R] 
[37254008, 36635712, 38713784, 38714664] 
>>> 
+0

耶穌!非常感謝。 – wizawu

2
_R = [0] * 5 
R = [_R] * 4 

這是一個NOGO。 R將包含_R 4倍,在同一個陣列的4倍......

使用這個代替:

R = [[0 for col in range(5)] for row in range(4)] 
+0

'[0 for col in range(5)]'這裏不需要,只需要[0] * 5就足夠了。 –

+0

是的,是的,這是pythonic的方式來做到這一點... :) –

+0

謝謝感謝致謝:) – wizawu