2012-04-12 7 views
12

通常、逆順にしたい、like hereフラットリストをPythonのリストのリストに変換します

>>> a=numpy.aranage(9) 
>>> a.reshape(3,3) 
>>> a 
array([[0, 1, 2], 
    [3, 4, 5], 
    [6, 7, 8]]) 

は、私はあなたが逆の操作を行う方法を思っていた、と私はあなたのような何かができるnumpyのではパイソン

に整形配列quasy、リストのリストにフラットなリストに変換することができますどのように思っていました私の通常の解決策は、次のようなものです:

もっと「Pythonic」の方法がありますか?それは@Lattywareで指摘したようにzip機能それがタプルを返すたびに、各引数に十分な項目がある場合

+0

組み込み関数 'list()'があるので、 'list'を変数名として使用しないことをお勧めします。 – jamylak

+0

あなたは正しいです。コードを速く編集していました。私の元のコードはそうではありません。 – Oz123

答えて

27
>>> l = ['a', 'b', 'c', 'd', 'e', 'f'] 
>>> zip(*[iter(l)]*2) 
[('a', 'b'), ('c', 'd'), ('e', 'f')] 

が、これはのみ動作します。パラメータの1つが他のパラメータより少ないアイテムを有する場合、アイテムは、例えば、カットされる。

>>> l = ['a', 'b', 'c', 'd', 'e', 'f','g'] 
>>> zip(*[iter(l)]*2) 
[('a', 'b'), ('c', 'd'), ('e', 'f')] 

このような場合は、それがこれは通常itertools documentationからハタのレシピを使用して行われ@Sven Marnachによって

How does zip(*[iter(s)]*n) work

+3

この解決法は、それを満たすのに十分な項目がある場合にのみ機能します。そうでない場合は項目が切り捨てられます。 –

+0

ジェネレータを作成し、そのジェネレータへの参照を複製する。賢い –

+1

@NickT技術的にはジェネレーターではなくイテレーターであり、私は賢さのためにクレジットを取ることができません:) – jamylak

11

をソリューションを使用するのが最善です:

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return itertools.izip_longest(fillvalue=fillvalue, *args) 

例:

>>> my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> list(grouper(2, my_list)) 
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', None)] 
はリストのリストではなく、フラットなリストからタプルのリストを好む場合
0

、その一つがこれを行うことができます:

a = range(20) # sample starting list 
    b = [] # new list 
    c = [] # alternate new list 
    # ny is length of new list. nx length of each list within it 
    nx = 5; ny = 4 
    bb = 0; ee = bb + nx # option one: sliding indeces for slices. 
    for ii in range(ny-1): 
     bb += nx 
     ee += nx 
     b.append(a[bb:ee]) 
     c.append(a[slice(ii*nx,nx*(ii+1))]) # option two, use slice() 

(私は1つのラインにループの全体を縮小して周りにプレイしましたリスト内包表記を含むが、成功していない。 これらのアプローチの利点の1つは、オリジナルのフラットリストが新しい、希望の次元の偶数倍ではないということですリストのリストは、あなたはすべてのデータを失うことはありません。最後のリストは、残りの部分が含まれているので、他のすべてのリストよりも短くなるという警告があります。これらの方法のどちらも私を非常に無性のものとして襲うものではありません。以下に示すように

+0

スライスの構文ではなく、2番目のアプローチで 'slice()'を使用する理由がわかりません。計算を行うということは、あなたが 'a [ii * nx:nx *(ii + 1)] 'などを使うことができないということを意味するものではありません。 – Blckknght

5

リストのリストを作成する別の方法を簡略化することができる。

>>>MyList = ['a','b','c','d','e','f'] 
# Calculate desired row/col 
>>>row = 3 
>>>col = 2 
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] 
>>>NewList 
[['a', 'b', 'c'], ['d', 'e', 'f']] 

この缶方法は、任意の行と列のサイズを生成するように拡張することができます。あなたは、行と列の値ようrow*col >len(MyList)を選択した場合、行/ COL仕様を満足するMyListの最後の値を含むサブリスト(行)が終了し、NewListは単に空のリストの適切な数で満たされる

>>>MyList = ['a','b','c','d','e','f','g','h'] 
>>>row = 3 
>>>col = 3 
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] 
>>>NewList 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g','h']] 

>>>row = 4 
>>>col = 4 
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)] 
[['a', 'b', 'c', 'd'], ['e', 'f', 'g','h'], [], []] 
+1

質問はリストのリストを要求していて、タプルのリストは要求していないので、受け入れられた答えであるはずです。または上記のコメントのRobertの答え。 –

関連する問題