の私のリストは、次のとおりです。ほとんどの神託(かつ効率的)な方法ペア
mylist=[1,2,3,4,5,6]
私はペアのリストにマイリストに変換したいと思います:
[[1,2],[3,4],[5,6]]
はニシキヘビがありますそうする方法?リストの理解? Itertools?
の私のリストは、次のとおりです。ほとんどの神託(かつ効率的)な方法ペア
mylist=[1,2,3,4,5,6]
私はペアのリストにマイリストに変換したいと思います:
[[1,2],[3,4],[5,6]]
はニシキヘビがありますそうする方法?リストの理解? Itertools?
[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)]
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を使用している場合(おそらくある)のメモリを節約するためにxrange
にrange
を変更、移植性のためrange
を使用しています。
代替方法:
タプルのリストを生成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 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。これは6個のアイテムのシーケンスに5つのペアを与えますが、これは間違っています。 itertoolsレシピが必要な場合は、 'grouper'でなければなりません。 –
あなたは間違いなしです。提案通りに修正されました。 –
マイ好ましい技術:
>>> mylist = [1, 2, 3, 4, 5, 6]
>>> mylist = iter(mylist)
>>> zip(mylist, mylist)
[(1, 2), (3, 4), (5, 6)]
私は通常、とにかく代わりに、リストの発電機を使用するので、2行目は、通常は必要ありません。
追加の楽しみのために、zipを 'zip(* [mylist] * groupsize)'に変更して、一般的なグループサイズを許可してください。もちろん、ジップ・ウェイは、必要なグループ・サイズで割り切れない長さのリストを扱う際に常に問題があります。 – Josiah
これは、これを行うための "最も無愛想な"方法のようです。 –
@ BrianM.Hunt私はそれに同意するのか分からない。 Pythonの禅は、「シンプルは複合より優れています」と言っています。そして、あなたがジッパーとイテレーターの仕組みを正確に理解していなければ、シンプルとはほとんど言えません。しかし、それは確かに最も賢い方法です。 – Josiah
もっと複雑にする必要があります。「xrange」に2を足して、数学の大部分が消えます。 –
フィードバックが組み込まれています。 – wberry