Python如何使用map()将列表拆分为子列表?

Python如何使用map()将列表拆分为子列表?,python,reduce,Python,Reduce,我有这个函数,可以根据长度、填充值和填充方向将iterables拆分为子列表: 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): r

我有这个函数,可以根据长度、填充值和填充方向将iterables拆分为子列表:

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
因为我喜欢一行,所以我想用map重写它,但我不知道怎么写。到目前为止,我有:

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))) 

我不知道。有什么提示吗?

我想你想得太多了。可以使用适当的解决此问题,而无需使用
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
说明:

  • :此函数用于将序列转换为iterable。iterable是自消耗的,只有一个方法,
    next
    ,它从iterable返回下一个元素,从左向右移动
  • [iter(l)]*size
    :创建
    大小的列表
  • :此运算符用于解压缩列表或元组
  • :转置元素。对于较短的序列,它由填充值填充
  • 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
说明:

  • 使用Python的。序列切片具有以下语法
    [开始:结束:跨步]
  • Python Range返回一个列表(在Py2.x中)和一个范围对象(在Py3.x中)作为一个序列/iterable,从
    start
    开始,在
    end
    结束,并步进
    stride
    元素。类似于
    (对于int i=start;i

  • [fill]*(size-len(结果[-1]))
    :生成
    (size-len(结果[-1]))
    将元素填充为列表。如果
    (size-len(result[-1]))
    是我喜欢的简洁。你能解释一下*解包吗?你忽略了一件事,那就是反转实际上反转了列表的原始顺序,以及填充应用的那一面。因此,我将编辑您的答案,以包括预期的功能!