这可以工作,但很笨重,而且不是很 "Pythonic"。我也希望能够运行 "numValues "的不同值,比如4到40......
innerList = []
outerList = []
numValues = 12
loopIter = 0
for i in range(numValues):
innerList.append(0)
for i in range(numValues):
copyInnerList = innerList.copy()
outerList.append(copyInnerList)
for i in range(len(innerList)):
for j in range(loopIter + 1):
outerList[i][j] = 1
loopIter += 1
print(outerList)
numValues = 12
result = [ [1] * i + [0] * (numValues - i) for i in range(1, numValues+1) ]
你可以用两个迭代器在一个嵌套的列表上做这个工作。range(numValues)
而只设置一个 1
当第二个迭代器是 <=
第一个。
numValues = 4
outerList = [[1 if j <= i else 0 for j in range(numValues)] for i in range(numValues)]
print(outerList)
输出。
[[1, 0, 0, 0], [1, 1, 0, 0], [1, 1, 1, 0], [1, 1, 1, 1]]
如果numpy是一个选项,可以这样做。很 轻易 np.tril
:
import numpy as np
n=5
out = np.ones((n,n))
np.tril(out)
array([[1., 0., 0., 0., 0.],
[1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0.],
[1., 1., 1., 1., 0.],
[1., 1., 1., 1., 1.]])
我觉得用numpy的矩阵方法更直观一些。
numValues = 5
my_array = np.eye(numValues)
它的结果是
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
从这个矩阵中你可以看到,你唯一需要做的思考是将行相加。
sol = [np.sum(mat[:i], axis=0) for i in range(numValues+1)][1:]
而你得到
[array([1., 0., 0., 0., 0.]),
array([1., 1., 0., 0., 0.]),
array([1., 1., 1., 0., 0.]),
array([1., 1., 1., 1., 0.]),
array([1., 1., 1., 1., 1.])]
一个有用的功能是乘以列表
>>> [1] * 3
[1, 1, 1]
你可以把它放在一个for循环中,然后添加所需的0。你可以想象这样的函数
def sublists(number: int) -> list:
"""
Creates sub lists which increases by one
"""
result = []
for i in range(number):
sub_list = [1] * (i + 1) + [0] * ( number - i - 1)
result.append(sub_list)
return result
然后你可以调用函数
>>> sublists(4)
[[1, 0, 0, 0], [1, 1, 0, 0], [1, 1, 1, 0], [1, 1, 1, 1]]