5

私のリストは:

mylist=[1,2,3,4,5,6]

mylistをペアのリストに変換したいと思います。

[[1,2],[3,4],[5,6]]

そうするためのpythonicな方法はありますか?リスト内包?Itertools?

4

5 に答える 5

9

うん、リスト内包はそれを行う私の通常の方法です:

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

于 2012-08-03T02:55:05.607 に答える
8

私の好みのテクニック:

>>> mylist = [1, 2, 3, 4, 5, 6]
>>> mylist = iter(mylist)
>>> zip(mylist, mylist)
[(1, 2), (3, 4), (5, 6)]

とにかく私は通常リストの代わりにジェネレーターを使用するので、2行目は通常必要ありません。

于 2012-08-03T03:06:22.347 に答える
6

別の方法:

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]))
于 2012-08-03T02:59:29.280 に答える
5

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)
于 2012-08-03T03:03:32.953 に答える
2

[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)]
于 2012-08-03T02:52:28.657 に答える