Python 如何反复移位和填充列表中的元素以获得列表列表?
我有一个列表Python 如何反复移位和填充列表中的元素以获得列表列表?,python,numpy,Python,Numpy,我有一个列表a=[1,2,3,…,n],我想反复移动列表以获得列表列表。第一行应该是A,第二行[2,3,4,…],第三行[3,4,5,…],直到最后一行[n,0,0,…]。最后一列中缺少的元素应为零。我试图将它们单独放置,但n大于等于100,因此手动填充零需要很长时间。我该怎么做 编辑有关numpy阵列的相同问题,这是我真正想问的。为了清晰起见,需要额外详细说明: import pprint A = [1,2,3,4,5] lists = [] lists.append(A) for _
a=[1,2,3,…,n]
,我想反复移动列表以获得列表列表。第一行应该是A
,第二行[2,3,4,…]
,第三行[3,4,5,…]
,直到最后一行[n,0,0,…]
。最后一列中缺少的元素应为零。我试图将它们单独放置,但n大于等于100,因此手动填充零需要很长时间。我该怎么做
编辑有关numpy阵列的相同问题,这是我真正想问的。为了清晰起见,需要额外详细说明:
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]]
[[1, 2, 3, 4], [2, 3, 4, 0], [3, 4, 0, 0], [4, 0, 0, 0]]
[[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]]
[[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
中的最后一个元素取“第1个”,并将其与零连接,形成一个名为new_list
的新列表
注意我之所以说“1th”,是因为python列表是0索引的,所以“1th”是第二个元素
>>> 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, 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]]
[[1, 2, 3, 4], [2, 3, 4, 0], [3, 4, 0, 0], [4, 0, 0, 0]]
[[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]]
输出:
[[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]]
[[1, 2, 3, 4], [2, 3, 4, 0], [3, 4, 0, 0], [4, 0, 0, 0]]
[[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]]
您正在创建的数组称为。如果您不介意依赖于
scipy
,则可以使用该函数通过单个函数调用创建数组:
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
的便利。你的迅速反应让我感到很谦卑。因为我是个新手,所以我对列表和数组感到困惑A'是一个数组,当我签出类型(A)时,我得到这个,numpy.ndarray
,当我打印出来(使用ipython),我得到:数组([[24.25,22.31,23.62,22.06,22.19,21.75,20.87,19.63,20,22.06]])
。根据您的解决方案,我尝试通过a.tolist()
将数组转换为列表,但没有达到预期效果。请帮忙@John1024,@jedwards,@Vinod Sharmai如果你真的有新问题,你应该发布一个新问题。在这种情况下,应将附加信息编辑到问题中。你得到了一个考虑到这一点的答案。@John1024:非常有效!谢谢。