我有一个列表A = [1, 2, 3, ..., n]
,并希望重复移动列表以获取列表列表。第一行应为A
,第二行为[2, 3, 4, ...]
,第三行为[3, 4, 5, ...]
,直到最后一行[n, 0, 0, ...]
。最后一列中缺少的元素应为零。我试图单独放置它们,但是n>> = 100因此手动填充零会花费很长时间。我该怎么做?
编辑 numpy数组的相同问题,这就是我真正拥有的。
答案 0 :(得分:5)
>>> a = [1, 2, 3, 4]
>>> [ a[i:] + i*[0] for i in range(len(a))]
[[1, 2, 3, 4], [2, 3, 4, 0], [3, 4, 0, 0], [4, 0, 0, 0]]
要获得第i个移位列表,我们可以使用:a[i:] + i*[0]
。对于我们需要的所有i,列表理解会重复这样做。
+
对于numpy数组来说意味着与普通python列表不同。因此,上述代码需要通过调整来使其适应numpy:
>>> import numpy as np
>>> a = np.arange(1, 5)
>>> [ np.concatenate((a[i:], np.zeros(i))) for i in range(len(a))]
[array([1, 2, 3, 4]),
array([2, 3, 4, 0]),
array([3, 4, 0, 0]),
array([4, 0, 0, 0])]
如果您希望最终结果是一个numpy数组:
>>> np.array([np.concatenate((a[i:], np.zeros(i))) for i in range(len(a)) ])
array([[ 1., 2., 3., 4.],
[ 2., 3., 4., 0.],
[ 3., 4., 0., 0.],
[ 4., 0., 0., 0.]])
答案 1 :(得分:1)
为了清晰起见,额外的冗长:
import pprint
A = [1,2,3,4,5]
lists = []
lists.append(A)
for _ in range(len(A)):
last_list = lists[-1] # Grab the last list element from lists
new_list = last_list[1:] + [0] # (See below)
lists.append(new_list) # Add new_list to the end of lists
pprint.pprint(lists)
输出:
[[1, 2, 3, 4, 5], [2, 3, 4, 5, 0], [3, 4, 5, 0, 0], [4, 5, 0, 0, 0], [5, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
new_list = last_list[1:] + [0]
只是意味着通过last_list
中的最后一个元素获取“1th”并将其与零连接以形成名为new_list
的新列表。
注意我说“1th”因为python列表是0索引的所以“1th”是第二个元素。
答案 2 :(得分:0)
A = [1, 2, 3, 4]
matrix = []
for i in range(len(A)):
row = A[i:]
row.extend([0 for i in range(len(A)-len(row))])
matrix.append(row)
print matrix
输出:
[[1, 2, 3, 4], [2, 3, 4, 0], [3, 4, 0, 0], [4, 0, 0, 0]]
答案 3 :(得分:0)
a = [0,1,2,3,4,5,6,7,8,9]
tam = a.__len__()
cont = 0
rdo = []
for item in a:
rdo.append(a[cont:tam]+(cont)*[0])
cont+=1
print rdo
输出:
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9, 0], [2, 3, 4, 5, 6, 7, 8, 9, 0, 0], [3, 4, 5, 6, 7, 8, 9, 0, 0, 0], [4, 5, 6, 7, 8, 9, 0, 0, 0, 0], [5, 6, 7, 8, 9, 0, 0, 0, 0, 0], [6, 7, 8, 9, 0, 0, 0, 0, 0, 0], [7, 8, 9, 0, 0, 0, 0, 0, 0, 0], [8, 9, 0, 0, 0, 0, 0, 0, 0, 0], [9, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
答案 4 :(得分:0)
您正在创建的数组称为Hankel matrix。如果您不介意依赖scipy
,可以使用函数scipy.linalg.hankel
通过单个函数调用创建数组:
In [21]: from scipy.linalg import hankel
In [22]: A = [1, 2, 3, 4, 5]
In [23]: hankel(A)
Out[23]:
array([[1, 2, 3, 4, 5],
[2, 3, 4, 5, 0],
[3, 4, 5, 0, 0],
[4, 5, 0, 0, 0],
[5, 0, 0, 0, 0]])
如果这是使用scipy
的唯一原因,我不会打扰 - 这是一个非常沉重的依赖。但是,如果您已经在使用scipy
,那么您也可以利用hankel
的便利性。