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

ワンライナーが好きなので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))) 

何も思いつきません。ヒントはありますか?

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 : この関数は、シーケンスを iterable に変換します。イテラブルは自己消費可能であり、イテラブルnextから左から右に移動して次の要素を返すメソッドが 1 つだけあります。
  • [iter(l)]*sizesize:イテラブルのリストを作成します
  • * (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 のExtended Sliceを使用しました。シーケンス スライスの構文は次のとおりです。[start: end: stride]
  • Python Range はリスト (Py2.x の場合) と range オブジェクト (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要素をリストとして生成します。が <=0 の場合(size - len(result[-1]))、空のリストが生成されます
  • result[-1] = result[-1] + [fill] * (size - len(result[-1]))- フィル値で最後のシーケンスを更新します
  • result[-1] = result[-1][::-1]: 方向がleft逆の場合、最後のシーケンス
于 2013-01-29T07:40:05.957 に答える