2012-08-03 7 views

答えて

2

[mylist[2*n:2*n+2] for n in xrange(len(mylist)/2)]

この溶液を元のリストから順番に対を抽出し、スライスのリストを作成するリストの内包とスライスの使用を組み合わせます。

また、xrangeを除いて同じスライスの代わりに2を数えると、[mylist[n:n+2] for n in xrange(0, len(mylist), 2)]となります。この提案についてSteven Rumbalskiに感謝します。

モンティ・パイソン・アンド・ナウ:ここzipを用いて、溶液(AB)は、代わりに中間割り当ての一時的な機能:

>>> (lambda i: zip(i, i))(iter(mylist)) 
[(1, 2), (3, 4), (5, 6)] 
+5

もっと複雑にする必要があります。「xrange」に2を足して、数学の大部分が消えます。 –

+0

フィードバックが組み込まれています。 – wberry

9

Yeppers、リストの内包はそれをやって私の通常の方法である:

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

私はあなたのpython 2を使用している場合(おそらくある)のメモリを節約するためにxrangerangeを変更、移植性のためrangeを使用しています。

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

「ハタをチェック"itertools documentationからのレシピ:

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

-1。これは6個のアイテムのシーケンスに5つのペアを与えますが、これは間違っています。 itertoolsレシピが必要な場合は、 'grouper'でなければなりません。 –

+0

あなたは間違いなしです。提案通りに修正されました。 –

8

マイ好ましい技術:

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

私は通常、とにかく代わりに、リストの発電機を使用するので、2行目は、通常は必要ありません。

+2

追加の楽しみのために、zipを 'zip(* [mylist] * groupsize)'に変更して、一般的なグループサイズを許可してください。もちろん、ジップ・ウェイは、必要なグループ・サイズで割り切れない長さのリストを扱う際に常に問題があります。 – Josiah

+0

これは、これを行うための "最も無愛想な"方法のようです。 –

+0

@ BrianM.Hunt私はそれに同意するのか分からない。 Pythonの禅は、「シンプルは複合より優れています」と言っています。そして、あなたがジッパーとイテレーターの仕組みを正確に理解していなければ、シンプルとはほとんど言えません。しかし、それは確かに最も賢い方法です。 – Josiah