3

我有这个函数可以按长度、填充值和填充方向将可迭代对象拆分为子列表:

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

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

4

1 回答 1

6

我相信你想太多了。这个问题可以使用石斑鱼配方适当地处理,而无需使用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

解释:

  • iter:此函数将序列转换为可迭代对象。Iterables 是自消费的,只有一个方法,next它从可迭代对象中返回下一个元素,从左到右移动。
  • [iter(l)]*size: 创建一个size可迭代的列表
  • * (Kleene star) : 此操作符用于解包列表或元组
  • izip_longest:转置元素。对于较短的序列,它由填充值填充
  • 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 的扩展切片。序列切片具有以下语法[start: end: stride]
  • Python Range 返回一个列表(在 Py2.x 中)和一个范围对象(在 Py 3.x 中)作为 sequence/iterable ,从 开始start,结束于end和步进stride元素。如同(for int i = start; i < stop; i+= stride)
  • [fill] * (size - len(result[-1]))(size - len(result[-1])) fill将元素生成为列表。如果(size - len(result[-1]))<=0 则生成一个空列表
  • result[-1] = result[-1] + [fill] * (size - len(result[-1]))- 用填充值更新最后一个序列
  • result[-1] = result[-1][::-1]:如果方向left与最后一个序列相反
于 2013-01-29T07:40:05.957 回答