如何创建一个列表,其中每个子列表 "递增 "如下。[1, 0, 0], [1, 1, 0], [1, 1, 1] [关闭]

问题描述 投票:3回答:5

这可以工作,但很笨重,而且不是很 "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)
python list
5个回答
12
投票
numValues = 12
result = [ [1] * i + [0] * (numValues - i) for i in range(1, numValues+1) ]

6
投票

你可以用两个迭代器在一个嵌套的列表上做这个工作。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]]

4
投票

如果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.]]) 

3
投票

我觉得用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
投票

一个有用的功能是乘以列表

>>> [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]]
© www.soinside.com 2019 - 2024. All rights reserved.