2016-03-04 98 views
4

我是新來的列表解析,並希望將下面的代碼複製到for循環嵌套列表理解。Python嵌套列表理解創建矩陣

master = [] 
inner = [] 
for x in range(1,8): 
    inner = [] 
    for y in range(1,x+1): 
     inner.append(str(x*y).rjust(2)) 

    master.append(inner) 

for m in master: 
    print ' '.join(m) 

輸出看起來是這樣的:

1 
    2 4 
    3 6 9 
    4 8 12 16 
    5 10 15 20 25 
    6 12 18 24 30 36 
    7 14 21 28 35 42 49 

我的想法是這樣的:

test = [ 
    [str(x*y).rjust(2) for x in range(1,8)] 
    for y in range(1,x+1) 
] 
for t in test: 
    print ' '.join(t) 

但我得到一個回溯錯誤:

Traceback (most recent call last): 
File "python", line 3, in <module> 
NameError: name 'x' is not defined 

任何蟒蛇專家小心點我在正確的可怕ction?

預先感謝您!

+1

你知道你的'master'循環是從1到8,但是你的邏輯會導致你「忘記」最後一行嗎? –

+0

@奧斯汀·黑斯廷斯......謝謝。我沒有注意到,但我已經更新了上面的例程來糾正,所以它不再「忘記」最後一行。 – mba12

回答

2

您打開您的for循環。只需切換回:

test = [ 
    [str(x*y).rjust(2) for y in range(1,x+1)] 
    for x in range(1,8) 
] 
for t in test: 
    print ' '.join(t) 

其原因是,你要一次爲每個x一個新的列表,但內部列表擁有多達數爲y

+0

謝謝! for循環的順序對我來說並不直觀。 – mba12

4

您可以使用下面的嵌套列表理解:

answer = [[i*j for i in range(1, j+1)] for j in range(1, 8)] 
print(answer) 

輸出

[[1], 
[2, 4], 
[3, 6, 9], 
[4, 8, 12, 16], 
[5, 10, 15, 20, 25], 
[6, 12, 18, 24, 30, 36], 
[7, 14, 21, 28, 35, 42, 49]] 
+1

謝謝!這也起作用。非常感激。 for循環的順序並不直觀。似乎在範圍(1,j + 1)中,j不會在範圍內但顯然是範圍。 – mba12