2016-05-14 14 views
1

Cでは、C++と同様に、forループの変更でインデックス(たとえば、i)を使用できます。今、私はこれが(variousreasonsのために)Pythonで実行することはできません知っているPythonの配列[++ i]と配列[i ++]に相当するコードはありますか?

for(int i = 0; i < end; i++) 
    if(array[i] == ':') 
    if(array[++i] == ')') 
     smileyDetected = true; 

:これは、次の要素を比較し、たとえば、現在の要素を比較し、その比較に基づいて、に役立ちます。しかし、私はPythonのための短い選択肢があるのか​​どうか疑問に思っていませんか?しかし、これは私にあなたが同じ複数回(「読みにくくは」長いファイルを有することを意味しませんでした)んまでそんなに悪く聞こえない余分なラインを、コスト

while i < end: 
    if array[i] == ':': 
     i += 1 
     if array[i] == ')': 
      smileyDetected = True; 

:私が思い付くことができます。 1行に入れるには、 array[i += 1]のようなものが考えられますが、これは無効な構文です。

インクリメントされたインデックスを読み出すのと同じ行にインデックスのインクリメントを行うPythonの同等物はありますか?

EDIT:
ほとんどの答えは、特定の例のための代替として、部分文字列を検索しinを使用して言及したように私は、このような方法で解けることはない別の例を追加してみましょう。

j = 0; 
for(int i = 0; i < end; i++) 
    if(array[i] == ':') 
    if(array[++i] == ')') 
     anotherArray[j++] = array[++i]; 

それは、インデックスの増分であり、特定の文字列の検索ではありません。

+0

なぜあなたは文字のペア*で文字列を反復しませんか? – jonrsharpe

+1

配列にC文字列がなく、 ':'が最後の文字である場合、C/C++は未定義の動作を示します。 –

+0

'array'が文字列の場合、' smiley_detected = ':)を 'array'に書くだけです。このような – kennytm

答えて

2

おそらく:

smileyDetected = ':)' in "".join(array) 

または@jonrsharpeあたり

:この特別な場合

from itertools import tee 

# pairwise() from "Itertools Recipes" 

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return zip(a, b) 

for a, b in pairwise(array): 
    if a == ':' and b == ')': 
     smileyDetected = True 
+0

最初に 'array = ['foo:'、 ')bar']' –

+1

'import *'をしないでください。 – L3viathan

+0

@ValentinLorentzあなたの例はOPのサンプルコードと一致しませんが、私の最初の解決策は実際には正しく処理します。 OPへのjonrsharpeのpairwise commetへのフォローアップのコメントとして投稿されました。 – cdlane

0

は、あなたが行うことができます:

for i, char in enumerate(array[:-1]): 
    if char == ":" and array[i+1] == ")": 
     smiley_detected = True 

しかし、より一般的な場合には、場合要素をスキップする必要がある場合は、生のイテレータを変更できます。

iterator = iter(array) 
for char in iterator: 
    if char == ":" and next(iterator) == ")": 
     smiley_detected = True 

ここでは、配列の境界にもっと注意を払う必要があります。最後の要素が:の場合は、空きイテレータのnextを呼び出すことからStopIteration例外が発生します。それを捕らえる必要があります。

+0

2番目は 'array '[' a '、': '、') '、' b '] 'を呼び出します。これは、すべてのループの**同じ**イテレーターでnext()を2回呼び出すためです。 –

+0

@ValentinLorentzいいえ、 ''と ''演算子が短絡しているので、現在の要素が '': ''である場合にのみ、nextを2回呼び出します。与えられた検索パターンに対しては '') ''で始めることはできないので、 '') ''がスキップされても問題ありません。 –

1

arrayが文字列の場合、最短ニシキヘビのバージョンは明らかに次のようになります。イテレータを使用することになり、これを行うの

smileyDetected = ':)' in array 

非文字列特定/もっと一般的な方法:

smileyDetected = (':', ')') in zip(array, array[1:]) 
関連する問題