2016-11-05 7 views
3

数値のリストの有効な測定値を返す関数をPythonで記述する必要があります。最も近い他の測定値が0.1秒未満である場合、測定値は無効です。また、出力リストは、入力リストの長さと同じ長さでなければなりません。したがって"有効な"数値を返す

list = [5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5] 
newlist = [] 

for i, j in zip(list, list[1:]): 
    if j - i >= .1: 
     newlist.append(True) 
    else: 
     newlist.append(False) 

問題は、これが次のリストを返すということです:1 False[True, True, True, False, False, True]

[5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5]は、私は次のような方法で問題にアプローチしてきた[True, True, True, False, False, False, True]

を返す必要があります測定がありません。

どうすればこのコードを書くことができますか?

+0

あなたのインデントを修正してください。 –

+0

問題の文は、出力リストの長さが入力リストの長さよりも1小さいことを意味します。しかし、次の例は、それらが等しいことを示しています。正しい。問題を言い換えることを検討してください。 –

答えて

2

あなたの前提は正しくありません。わずか2つの誤った測定値があります。 10.37のものと10.45のもの。 10.34での測定は、前の測定の数秒後に起こるのでOKです。あなたは2

で値2を比較しているので、

あなたの結果は、入力リストより1つの少ない値を持つことは、典型的な「間隔&値」問題です。値よりも1つ少ない間隔があります。

より良い性能(リストの内包)のためにこのようなあなたのテスト書く:場合は、しかし、

measures = [5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5] 
print([abs(measures[i+1]-measures[i])>0.1 for i in range(len(measures)-1)]) 

[True, True, True, False, False, True] 

(あなたのコードは役に立たない一時的なリストの多くを作成します。また、変数としてlistを使用しないでください。)

をあなたは、ウィンドウをスライディングして、近すぎるすべて測定、ない派手なものを無効にしたい:

measures = [5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5] 
result = [True] * len(measures) 

for i in range(len(measures)-1): 
    validity = abs(measures[i+1]-measures[i])>0.1 
    if result[i]: # don't overwrite an already invalidated value 
     result[i] = validity 
    result[i+1] = validity 

print(result) 

[True, True, True, False, False, False, True] 

の詳細:

  • は、入力配列のサイズのresultアレイ作成(*オペレータをいい)
  • リストのすべての要素を反復が、最後の
  • 電流値と「次を比較現在resultが既にFalseが "validityフラグ(True又はFalse
  • を計算する値は、それがに設定ほか、そのままで残して、前の反復は、既にそれを無効にすることを意味します10
  • セット "次" validityi+1インデックス)

になりません一時リストの作成は、十分に高速である必要があります。

+0

「10.34」と「10.45」がそれぞれ0.1秒未満であるためOPの要件「最も近い他の測定値が0.1秒未満である」は両方向に向いているように見えます。したがって、OPの記載された出力は正しい。あなたは私のOPの解釈に異議はありますか?私の解釈に対応する別の答えを出すこともできます。なぜなら、あなたの答えはそうでなければかなり良いからです。 –

+0

これは私のプログラミングクラスの宿題であり、3つの「誤った」測定値があるはずです。 10.34の測定値は、前の測定値より数秒後に発生しますが、次の測定値の0.1秒前に表示されるため、Falseにもなります。 –

+0

大丈夫、3つの 'False'値を作成する別のバージョンを追加しました。リストの理解は(sob :))しかし、単純です。 –

0

私はこの方法で解決します。最初のダミーの有効な値をリストの先頭と末尾に挿入し、後で前と後の値と比較できるようにします。 次に、追加したダミーに含まれていない値のチェックを開始します。

# rename var name to lst, not recommended to use keyword list as var name 
lst = [5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5] 
lst2 = [lst[0]+1] + lst + [lst[-1]+1] 
# use absolute function so we checking the absolute difference 
newlist = [ abs(lst2[i]-lst2[i+1]) >= 0.1 and abs(lst2[i]-lst2[i-1]) >= 0.1 for i in range(1, len(lst)+1)] 

# result newlist 
# [True, True, True, False, False, False, True] 
0

別のオプションは、(Skyccの答えは同じことを行いますが、より簡潔である)明示的なループの必要はありません、その場合には、numpyのを使用することです:

import numpy as np 
a = np.array([5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5]) 

delta = np.diff(a) # forward difference 
delta = np.insert(delta, 0, delta[0]) # duplicate the first delta at the beginning 
delta = np.append(delta, delta[-1]) # duplicate last delta at the end 

valid = np.abs(delta) >= 0.1 # boolean vector 
関連する問題