Python嵌套列表理解以创建矩阵

时间:2016-03-04 15:14:56

标签: python list-comprehension

我是列表理解的新手,并希望将以下代码中的for循环复制到嵌套列表理解中。

 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

任何蟒蛇专家都想指出我正确的方向吗?

提前谢谢!

3 个答案:

答案 0 :(得分:7)

您可以使用以下嵌套列表解析:

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 :(得分: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一样多。

答案 2 :(得分:1)

  

Python 3

print("\n".join([" ".join([str(x*y) for y in range(1,x+1)]) for x in range(1,8) ]))
  

Python 2

print "\n".join([" ".join([str(x*y) for y in range(1,x+1)]) for x in range(1,8) ])
  

两步过程。

     

按空格加入列表。输出'1','2 4','3 6 9'等

     

通过'\ n'连接结果列表并打印结果