我有这个函数可以将迭代按长度,填充值和填充方向分成子列表:
def split(v,size,fill=0,direction='right'):
if size == 0: return []
lenv = len(v)
count = lenv/size
remainder = lenv%size
result = []
for i in range(0,lenv-remainder,size):
result.append(v[i:i+size])
if remainder > 0:
if direction == 'right':
result.append(v[count*size:] + [fill] * (size-remainder))
else:
result.append([fill] * (size-remainder) + v[count*size:])
return result
因为我喜欢一个衬垫我想用地图重写它,但我不明白怎么做。到目前为止我有这个:
def j1(a,b):
return a + b
def j2(a,b):
return b
def split2(v,size,fill=0):
map(j1,(x for x in map(j2,v)))
我不知道。任何提示?
答案 0 :(得分:6)
我相信你的想法太多了。使用grouper recipe而不使用map
def split1(v,size,fill=0,direction='right'):
result = list(izip_longest(*[iter(l)]*size, fillvalue=fill))
if direction == 'left':
result[-1] = result[-1][::-1]
return result
说明:
next
,它从迭代中返回下一个元素,从左向右移动。[iter(l)]*size
:创建size
iterables result[-1] = result[-1][::-1]
:如果方向是left
,则反转最后一个序列另一种没有石斑鱼的流行解决方案是
def split2(v,size,fill=0,direction='right'):
result = [v[i:i+size] for i in range(0,len(v),size)]
result[-1] = result[-1] + [fill] * (size - len(result[-1]))
if direction == 'left':
result[-1] = result[-1][::-1]
return result
说明:
[start: end: stride]
start
开始,以end
结束并步进{{ 1}}元素。与stride
(for int i = start; i < stop; i+= stride)
:生成[fill] * (size - len(result[-1]))
(size - len(result[-1]))
个元素作为列表。如果fill
是&lt; = 0,则会生成一个空列表(size - len(result[-1]))
- 使用填充值更新最后一个序列result[-1] = result[-1] + [fill] * (size - len(result[-1]))
:如果方向是result[-1] = result[-1][::-1]
,则反转最后一个序列