リストの最後の項目を除くすべてをループする方法は?


160

リストをループして、各アイテムとそれに続くアイテムをチェックします。

最後の項目を除くすべてをループして、yでxを使用する方法はありますか?可能であれば、インデックスを使用せずにそれを実行したいと思います。

注意

freespaceが私の実際の質問に答えたので、私は答えを受け入れましたが、SilentGhostは私が尋ねたはずの質問に答えました。

混乱をお詫びします。

回答:


315
for x in y[:-1]

yがジェネレーターの場合、上記は機能しません。


これで私の質問に答えることができましたが、xの後でどのようにアイテムを取得するのかを忘れていました。これは可能ですか?
デビッドサイクス、

3
-1質問に対する答えはないと思います。各アイテムを次のアイテムと比較することはありません。– odwl 0秒前
odwl 2009年

4
そうだと思います。著者は、Xを実行することを希望し、Yを実行する方法を尋ねました。私はYを実行する方法を答えました。彼が私の答えを受け入れたということは、彼が本当に望んでいた質問ではないにしても、彼が尋ねた質問に答えたことを示します。アスカーはこの答えを降格することを歓迎します。
空き領域

7
OPが最初に別の質問をする必要があるからといって、彼の質問とこの回答が他の人にとってあまり役に立たないということではありません。+1
ファルケン教授2012

1
これはジェネレーターでは機能しないと述べました。y発電機の場合の代替手段は何ですか?
Joost

50

シーケンス項目を以下と比較する最も簡単な方法:

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)

15
これは私が尋ねたかった質問に答えます。ありがとう
デビッドサイクス

3
実際には、zipは長いリストを短いリストの長さに切り詰めるため、最初のスライスを省略できます。これにより、リストを1つ作成する手間が省けます。(巨大なリストを扱っている場合に備えて。しかし、その場合は、Ants Aasmaのアプローチに従う必要があります。これは何もコピーしません。)
bayer

19

シーケンスペアのすべての要素を賢く取得したい場合は、このアプローチを使用します(ペアワイズ関数はitertoolsモジュールの例からのものです)。

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    b.next()
    return izip(a,b)

for current_item, next_item in pairwise(y):
    if compare(current_item, next_item):
        # do what you have to do

最後の値を特別な値と比較する必要がある場合は、その値を最後にチェーンします

for current, next_item in pairwise(chain(y, [None])):

組み込みの変数名シャドウにnextを使用することに注意してください
SilentGhost '27年

1
個人的には、変数のスコープが小さく、名前が読みやすくなる場合は、使用頻度の低い組み込みのシャドウイングを気にしません。それにもかかわらず、適切なコーディング方法を維持するために変数名を編集しました。
アリAasma 2009年

5

リストのn番目のアイテムをn + 1番目のアイテムと比較するつもりなら、

>>> for i in range(len(list[:-1])):
...     print list[i]>list[i+1]

そこにはハードコーディングはありません。これは、別の感じがない限り問題ありません。


3
リストのコピーを回避するには、len(list [:-1])をlen(list)-1に置き換えます。リストと呼ばれる変数の使用は避けてください
Remy Blank '27年

2

リストをインスタンス化せずに各アイテムをイテレータの次のアイテムと比較するには:

import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
  print a, b

2
蟻Aasmaによって示唆された正確に何だそのstackoverflow.com/questions/914715/...
SilentGhost

1

この答えはOPが何を求めている必要があり、連続する要素(優れた比較すなわちトラバースAリストSilentGhostの答えは)、まだグループ(一般用nグラム 2、3、...:) n

zip(*(l[start:] for start in range(0, n)))

例:

l = range(0, 4)  # [0, 1, 2, 3]

list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []

説明:

  • l[start:] インデックスから始まるリスト/ジェネレータを生成します start
  • *listor *generator:すべての要素を、zipそれが書かれたかのように囲み関数に渡しますzip(elem1, elem2, ...)

注意:

私の知る限り、このコードはそれが可能な限り怠惰です。未検証。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.