2016-04-11 6 views
0

ためのリスト要素のインデックスをで識別するためのPythonを強制的に単純なリストがあり、例えば、どのように正しくループ

my_list = ['a', 'b', 'b', 'c', 'c'] 

が、私は、各反復の前の要素の値を取得するためにforループでmy_list[1:]を介して実行します:

for i in my_list[1:]: 
    print(my_list[my_list.index(i)-1]) 

私は出力にa b b cを参照してください、代わりにa a b bを取得することが期待。 は私が期待される出力を取得するには、このコードを修正する方法

...これは、2つの要素だけ"b"だけでなく、2 "c"があるという事実を無視して最初のi、ためためindex()方法検索だと思いますか?前任者又はsucessorsと

+0

あなたはこれをしたい理由はありますか?なぜ 'my_list [: - 1] 'を反復するだけではないのですか? –

答えて

4

list.index()方法は、その引数の最初の発生の指標を返します。リストに複数の重複した項目があるため、期待した結果が得られません。

>>> my_list = ['a', 'b', 'b', 'c', 'c'] 
>>> 
>>> my_list[:-1] 
['a', 'b', 'b', 'c'] 

それとも、ループを介してこれらの項目にアクセスしたい場合は、以下のようなzip()機能を使用することができます:

>>> for i, j in zip(my_list,my_list[1:]): 
...  print(i, j) 
... 
a b 
b b 
b c 
c c 
2

マッチング要素zipための一般的な使用例である:

In [13]: for i,prior in zip(my_list[1:], my_list[0:]): 
    print (prior) 
    ....:  
a 
b 
b 
c 
-1

これは、トリックを行いますが、あなたの期待される出力を得るために、単純なスライシングを使用することができます:

for i in range(len(my_list)+1): 
    try: print(my_list[i-1]) 
    except: print 'it is 1st iteration' 
+0

' my_list [-1] 'は例外を発生させません。 –

2

あなたは常に(もっとforeachのように実際にある)「の」の代わりにPythonのために「C /パスカル/ Perlの/何の動作をエミュレートすることができます。最初の反復で最後の要素を返さないように、範囲は1から始まることに注意してください。

for i in range(1, len(my_list)): 
    print(my_list[i], my_list[i-1]) 

Pythonicはあまりありませんが、このアプローチは、他の言語の背景を持つ人々にとっては、より直感的です。

+0

注: 'my_list [0-1]'は 'IndexError'を送出しません。 –

+0

もしそれがpythonicでないなら、投稿しないでください。また、Robᵩは言った – hop

+0

私の悪い、もちろんそれはIndexErrorを発生させない、それは-1st、* ie *最後の要素を返します。 OPが求めるものはほとんどありません。それを反映する答えを編集しました。 – Synedraacus

1

お気づきのように、indexを使用すると、常に指定された要素の最初の位置が見つかるため、ここでは機能しません。また、最悪の場合、毎回リスト全体を検索する必要があるため、かなり無駄です。

あなたはそのインデックスと一緒に要素を取得するためにstartパラメータでenumerateを使用することができます。

start = 1 
for i, x in enumerate(my_list[start:], start): 
    print(i, x, my_list[i-1]) # index, current, last 
関連する問題