如何重复移动和填充列表中的元素以获取列表列表?

时间:2015-03-16 20:06:01

标签: python numpy

我有一个列表A = [1, 2, 3, ..., n],并希望重复移动列表以获取列表列表。第一行应为A,第二行为[2, 3, 4, ...],第三行为[3, 4, 5, ...],直到最后一行[n, 0, 0, ...]。最后一列中缺少的元素应为零。我试图单独放置它们,但是n>> = 100因此手动填充零会花费很长时间。我该怎么做?

编辑 numpy数组的相同问题,这就是我真正拥有的。

5 个答案:

答案 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

+对于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的便利性。