1

重複の可能性:
Python:リストの最後の項目を除くすべてをループする

リストを繰り返し処理したいとします。繰り返すたびに、現在の項と次の項の両方を使用して何かを計算したいと思います。私は次のようなことをすることができます

mylist = [1, 2, 3, 4]
for i in range(len(mylist)):
    try:
        compute(mylist[i], mylist[i+1])
    except IndexError:
        compute(mylist[i])

私もできた

mylist = [1, 2, 3, 4]
for num in mylist:
    try:
        compute(num, mylist[mylist.index(num)+1])
    except IndexError:
        compute(num)

これらのどちらも特に良いようには見えません。これを行うためのよりPython的なアプローチはありますか?

4

4 に答える 4

1

組み込み関数を使用できますenumerate

mylist = [1, 2, 3, 4]
for i, num in enumerate(mylist):
    try:
        compute(num, mylist[i+1])
    except IndexError:
        compute(num)

ただし、2つの実装のどちらかを選択するのはかなり簡単です。2番目は()がはるかに遅いだけでなくO(n^2)、要素を繰り返すための奇妙なセマンティクスもあります。

于 2012-11-27T00:31:35.410 に答える
1

これを行うには3つの方法があります(ただし、条件が異なる場合を除いて、おそらく最初の方法をお勧めします)。

  1. 使用itertools.izip()-それは効率的でPythonicになります:

    for item1, item2 in itertools.izip(my_list, my_list[1:]):
        # do something...
    
  2. 使用enumerate()

    for index, item in enumerate(my_list):
        # do something...
    
  3. 前の行を変数に格納します(この例では、リストに行がないことを前提とNoneしています)。

    previous = None
    for item in my_list:
        if previous is None:
            previous = item
            continue
        # do something...
    
于 2012-11-27T00:36:13.960 に答える
0

itertoolsを使用しない機能スタイルは、次のようになります。

for t in zip(mylist, mylist[1:]):
    compute(*t)

パフォーマンスが同等である場合は、 itertools.izipを使用して、zip中にintermeidaリストが作成されないようにすることができます。

質問に示されているような特殊なケースをカバーするには、次を使用します。

for t in zip(mylist, mylist[1:]) + [(mylist[-1],)]
    compute(*t)
于 2012-11-27T00:27:30.460 に答える
0

最後にあなたの特別なケースをカバーするために、あなたは必要です:

for t in zip(mylist, mylist[1:]) + [(mylist[-1],)]
    compute(*t)
于 2012-11-27T00:35:42.483 に答える