web-dev-qa-db-ja.com

リストを2つずつループする方法は?

可能な重複:
チャンクでリストを繰り返す最も「Pythonic」な方法は何ですか?

私はPythonリストをループして、一度に2つのリスト項目を処理したいと思います。別の言語でこのようなもの:

for(int i = 0; i < list.length(); i+=2)
{
   // do something with list[i] and list[i + 1]
}

これを達成するための最善の方法は何ですか?

216
froadie

あなたは2のステップサイズで範囲内で使うことができます:

Python 2

for i in xrange(0,10,2):
  print(i)

Python 3

for i in range(0,10,2):
  print(i)

注:Python 2では、rangeではなくxrangeを使用してください。リスト全体ではなく、反復可能なオブジェクトが生成されるため効率的です。

322
Brian R. Bondy

この構文(L[start:stop:step])を使うこともできます。

mylist = [1,2,3,4,5,6,7,8,9,10]
for i in mylist[::2]:
    print i,
# prints 1 3 5 7 9

for i in mylist[1::2]:
    print i,
# prints 2 4 6 8 10

最初の桁が開始インデックス(デフォルトはリストの先頭または0)、2番目が終了スライスのインデックス(デフォルトはリストの末尾)、3桁目がオフセットまたはステップです。

78
jathanism

私の考えでは最も単純なのはこれだけです。

it = iter([1,2,3,4,5,6])
for x, y in Zip(it, it):
    print x, y

追加の輸入品などはありません。そして私の意見では、とても優雅です。

41
carl

Python 2.6以降を使用している場合は、 itertools のgrouper レシピ を使用できます。モジュール:

from itertools import izip_longest

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

このように呼び出します。

for item1, item2 in grouper(2, l):
    # Do something with item1 and item2

Python 3.xではZip_longestの代わりにizip_longestを使うべきです。

39
Mark Byers
nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]

Kindaは汚れているがそれはうまくいく。

5
Ishpeck

これはizip_longestソリューションほど速くはないかもしれません(私は実際にそれをテストしませんでした)、しかしそれはpython <2.6(izip_longestは2.6で追加されました)で動作するでしょう:

from itertools import imap

def grouper(n, iterable):
    "grouper(3, 'ABCDEFG') --> ('A,'B','C'), ('D','E','F'), ('G',None,None)"
    args = [iter(iterable)] * n

    return imap(None, *args)

あなたが2.3より前に行く必要があるなら、imapの代わりに組み込みのマップを使うことができます。欠点は、塗りつぶしの値をカスタマイズする機能がないことです。

2
lambacck

リストの構造を制御している場合、最もPythonicでやるべきことはおそらくそれをから変更することでしょう:

l=[1,2,3,4]

に:

l=[(1,2),(3,4)]

そして、あなたのループは次のようになります。

for i,j in l:
    print i, j
0
Jorenko