私のリストは:
mylist=[1,2,3,4,5,6]
mylistをペアのリストに変換したいと思います。
[[1,2],[3,4],[5,6]]
そうするためのpythonicな方法はありますか?リスト内包?Itertools?
私のリストは:
mylist=[1,2,3,4,5,6]
mylistをペアのリストに変換したいと思います。
[[1,2],[3,4],[5,6]]
そうするためのpythonicな方法はありますか?リスト内包?Itertools?
うん、リスト内包はそれを行う私の通常の方法です:
>>> groupsize = 2
>>> [mylist[x:x+groupsize] for x in range(0,len(mylist),groupsize)]
[[1,2],[3,4],[5,6]]
>>> groupsize = 3
>>> [mylist[x:x+groupsize] for x in range(0,len(mylist),groupsize)]
[[1,2,3],[4,5,6]]
私range
は移植性のために使用します。Python2を使用している場合(おそらくそうです)、メモリを節約するためrange
にをに変更します。xrange
私の好みのテクニック:
>>> mylist = [1, 2, 3, 4, 5, 6]
>>> mylist = iter(mylist)
>>> zip(mylist, mylist)
[(1, 2), (3, 4), (5, 6)]
とにかく私は通常リストの代わりにジェネレーターを使用するので、2行目は通常必要ありません。
別の方法:
zip( mylist[:-1:2], mylist[1::2] )
タプルのリストを生成します。
>>> zip(mylist[:-1:2],mylist[1::2])
[(1, 2), (3, 4), (5, 6)]
リストのリストが本当に必要な場合:
map(list, zip(mylist[:-1:2],mylist[1::2]))
itertoolsのドキュメントから「grouper」レシピを確認してください。
def grouper(n, iterable, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
[mylist[2*n:2*n+2] for n in xrange(len(mylist)/2)]
このソリューションは、リスト内包表記とスライスの使用を組み合わせて、元のリストから順番にペアを抽出し、スライスのリストを作成します。
または、スライスの代わりに2でカウントすること[mylist[n:n+2] for n in xrange(0, len(mylist), 2)]
を除いて、これは同じです。xrange
提案してくれたStevenRumbalskiに感謝します。
zip
そして今、完全に異なる何かのために:これは中間割り当ての代わりに(ab)使用する解決策と一時的な関数です:
>>> (lambda i: zip(i, i))(iter(mylist))
[(1, 2), (3, 4), (5, 6)]