Python 数组的自动零填充

Python 数组的自动零填充,python,arrays,list,numpy,Python,Arrays,List,Numpy,让L成为一个列表,例如55项: L=range(55) for i in range(6): print L[10*i:10*(i+1)] 对于i=0、1、2、3、4,打印列表将有10个项目,但对于i=5,它将只有5个项目 有没有一种快速的方法可以自动调零L[50:60],使其长度为10个项目?使用NumPy: >>> L = range(55) >>> for i in range(6): ... print (L[10*i:10*(i+1)]

L
成为一个列表,例如55项:

L=range(55)
for i in range(6):
 print L[10*i:10*(i+1)]
对于i=0、1、2、3、4,打印列表将有10个项目,但对于i=5,它将只有5个项目


有没有一种快速的方法可以自动调零L[50:60],使其长度为10个项目?

使用
NumPy

>>> L = range(55)
>>> for i in range(6):
...     print (L[10*i:10*(i+1)] + [0]*10)[:10]
...
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
[50, 51, 52, 53, 54, 0, 0, 0, 0, 0]
>>> a = np.arange(55)
>>> a.resize(60)
>>> a.reshape(6, 10)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54,  0,  0,  0,  0,  0]])

这可能看起来像是一个巫术,还请注意,这会创建一个
元组,而不是一个列表

from itertools import izip_longest

L = range(55)
list_size = 10
padded = list(izip_longest(*[iter(L)] * list_size, fillvalue=0))
for l in padded:
    print l

有关
zip
+
iter
技巧的解释,请参阅文档

您还可以将智能构建到您的对象中。我漏掉了角落里的箱子;这正好说明了这一点

class ZeroList(list):
    def __getitem__(self, index):
        if index >= len(self):c
            return 0
        else: return super(ZeroList,self).__getitem__(index)

    def __getslice__(self,i,j):
        numzeros = j-len(self)
        if numzeros <= 0:
            return super(ZeroList,self).__getslice__(i,j)
        return super(ZeroList,self).__getslice__(i,len(self)) + [0]*numzeros

>>> l = ZeroList(range(55))
>>> l[40:50]
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
>>> l[50:60]
[50, 51, 52, 53, 54, 0, 0, 0, 0, 0]
类零列表(列表):
定义uu获取项目uu(自身,索引):
如果索引>=len(自):c
返回0
else:返回super(ZeroList,self)。\uuuu getitem\uuuu(index)
定义获取切片(self,i,j):
numzeros=j-len(自)
如果numzeros>>l=ZeroList(范围(55))
>>>l[40:50]
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
>>>l[50:60]
[50, 51, 52, 53, 54, 0, 0, 0, 0, 0]

pprint
会做得更好吗?@ashishnitinpail,这与问题有关吗?不,只是问它是否会按我认为的方式打印?Nvm,我正在尝试。有点夸张,但很酷:)小心你的凹痕。应该有额外的4个空格来缩进代码,这可能会干扰制表符缩进。我相信您可以将
调整大小
重塑
步骤结合起来,只需执行
a.resize(6,10)
。另外,由于OP似乎对打印感兴趣,也许更好的解决方案是
np.resize(a,(6,10))
,它返回一个调整大小的副本,而不是修改原始数组。@askewchan,但不会在数组末尾填充0。没错,测试时它会重复数组:P,我看到形状匹配,没有寻找零。多么奇怪的矛盾;如果两者都提供了
fill=
关键字,那就太好了。在Python3.x中,函数名是zip\u