2016-07-28 2 views
0

数字のリストを繰り返し、0、0以外の0のシーケンスを識別し、その間の値を0に '正規化'する方法があります。シーケンスを識別して変更するためのPythonリストの理解

ここ

は私のコードです:

for index in range(len(array)-2): 
    if array[index] == 0 and array[index + 1] != 0 and array[index + 2] == 0: 
     array[index + 1] = 0 

これは現在正常に動作し、私が0の配列を検出するためのさらなる方法を持って、NZ、NZ、0など

私はPythonでリストの内包表記に探していましたしかし、この特定のcaでどこから始めるべきかを考え出すことに問題がありますse。リストの理解を使ってこれを行うことは可能ですか?

+0

、あなたはゼロにする値を設定する意味ですか? – Psidom

+0

したがって、2つのゼロの間の値はゼロになりますか? –

+0

はいそうです。 – ugotchi

答えて

2

コメントとアドバイスから、私の元のコードは、プロセスを実行する最も簡単でおそらく最も効率的な方法だと思われます。それ以上の答えは必要ありません。

2

あなたは私はあなたが条件にいくつかの対称性を追加し、あなたが本当に価値をチェックする必要がないという事実を利用するために反復処理範囲を調整してきました

new_array = [ 0 if (array[i-1] == array[i+1] == 0) 
       else array[i] 
       for i in range(1,len(array)-1) ] 

# More readable, but far less efficient 
array = array[0] + new_array + array[-1] 

# More efficient, but less readable 
# array[1:-1] = new_array 

のようなものを試してみてくださいarray[i];それが0の場合は、明示的に新しい値を0に設定しても問題ありません。

しかし、これは元のループと同じくらい明確ではなく、必要に応じて元のリストを変更するのではなく、新しいリストを不必要に作成します。

+1

これは最初と最後の要素を切り詰めませんか?おそらくスライス代入を修正する: 'array [1:-1] = ... ' –

+0

私は同意すると、これは私の元のコードよりも読みにくいようです。私は時系列リストのデータで連続的なパターンを探すこれらのタイプのメソッドが約6つあるので、よりエレガントで効率的なものを望んでいました。 – ugotchi

+0

うん、端のケースを処理するのを忘れてしまった。私は修正します。 – chepner

-2

すべてが理解である必要はありません。あなたがが拷問になりたい場合は、次の

def f(a): 
    [a.__setitem__(i + 1, 0) for i, (x, y, z) in enumerate(zip(a, a[1:], a[2:])) 
    if x == z == 0 and y != 0] 

あなたは `normalize`言うとすると

>>> a = [1, 2, 0, 1, 0, 4] 
>>> f(a) 
>>> a 
[1, 2, 0, 0, 0, 4] 
関連する問題