2017-09-27 17 views
3

浮動小数点型の特定の値を持つ要素のリストがあります。要素を反復して特定の値を超えている場合はカウントしますが、最小値の場合は限界値を超えた場合にのみカウントします。以下の入力を持っているのであれば、たとえば、:treshold_value 1.0が連続してインデックスのみ0-3で4回を超えているので、特定の値を超える要素をカウントする場合

list_of_values = [2.0, 2.0, 2.0, 2.0, 0, 0, 2.0, 2.0, 2.0, 0, 0] 
treshold_value = 1.0 
minimum_count = 4 

答えは、4でなければなりません。しきい値を超えるすべての連続したサブシーケンス値の合計がカウントされなければならない:私は今、以下のコード、

for value in list_of_values: 
    if value >= treshold_value: 
     counter += 1 
    if counter >= (minimum_count): 
     time_use += 1 
    if value < min_treshold_value: 
     counter = 0 
print(time_use) 

私はこの:)

編集を達成するためにいくつかの神託の方法があるはず知っています。

+0

何 'list_of_values'が第一項目として' 1.0'を持っている場合:?

このコードは次のように、はるかに少ない読み出し可能より簡潔に書かれた、とすることができますか何が結果になるはずですか? – RomanPerekhrest

+0

次に、1.0は> = treshold_valueであるため、カウンタは1だけインクリメントされます。すべての値 ConSod

+0

条件を満たす複数の数値がある場合はどうなりますか? '[2.0、2.0、2.0、2.0、0、0、3.0、2.0、2.0、2.0、10.0、0、0]'?結果は4,5、または9であるべきですか? – mhawke

答えて

1

あなたが支援するitertools.groupby()を使用することができます。

from itertools import groupby 

def count_runs(list_of_values, threshold_value=1.0, minimum_count=4): 
    count = 0 
    for k, g in groupby(list_of_values, key=lambda x: x >= threshold_value): 
     if k: 
      g = list(g) 
      if len(g) >= minimum_count: 
       count += len(g) 
    return count 

>>> count_runs([2.0, 2.0, 2.0, 0.0, 0, 0, 2.0, 2.0, 2.0, 0, 0]) 
0 
>>> count_runs([2.0, 2.0, 2.0, 2.0, 0, 0, 2.0, 2.0, 2.0, 0, 0]) 
4 
>>> count_runs([2.0, 2.0, 2.0, 2.0, 0, 0, 3.0, 2.0, 2.0, 2.0, 10.0, 0, 0]) 
9 

これは、ある値の数のカウントを提供しますグループのしきい値を超えてminimum_count以上。条件に一致する複数のグループを処理することに注意してください。

例えば最後例えばgroupby()は、以下を返します。

>>> list_of_values = [2.0, 2.0, 2.0, 2.0, 0, 0, 3.0, 2.0, 2.0, 2.0, 10.0, 0, 0] 
>>> for k, g in groupby(list_of_values, key=lambda x: x >= threshold_value): 
...  print(k, list(g)) 
... 
True [2.0, 2.0, 2.0, 2.0] 
False [0, 0] 
True [3.0, 2.0, 2.0, 2.0, 10.0] 
False [0, 0] 

1つの以上の値の任意のグループ> =閾値はキーTrueのグループに表示されます。長さ> =最小数のものだけがさらに考慮され、その長さは他のそのようなグループで集計されます。

def count_runs(list_of_values, threshold_value=1.0, minimum_count=4): 
    return sum(count for count in (len(list(g)) for k, g in groupby(list_of_values, key=lambda x: x >= threshold_value) if k) if count >= minimum_count) 
0

リストを繰り返して、key = float numberおよびvalue =この番号に遭遇した回数の辞書を作成します。閾値を上回る浮動小数点数を加算するだけです。このようなものは:

d = {} 
for f in list_of_values : 
    if f > treshold: 
     if d.get(f,False): 
      d[f] +=1 
     else: 
      d[f] = 1 
max = 0 
for k,v in d.iteritems(): 
    if v> max: 
     max = v 

return max 
+0

あなたのforループの構文に問題があります。 –

2

適切なキー機能を条件付き発電機とmaxgroupby次の使用は動作するはずです:

from itertools import groupby 

len(max((list(g) for k, g in groupby(list_ov, key=lambda x: x > threshold) if k), key=len)) 

groupbyグループのiterableを連続して同じ値のWRTによってキーの機能に。これは、キー値のペアとサブイテラブルに応じたペアを生成します。

+2

LOL、妻と母親との休日のハイキングに...電話でアプリから投稿して死んで退屈:Dはwikiボックスをチェックしている必要があります – schwobaseggl

+0

母、あなたの時間をお楽しみください。 –

+0

この回答は、 'groupby() 'などが分からない人にもっと役立つ説明が必要です。 – mhawke

0

あなたが注文を気にしないようです。この場合、隣接する要素のみをグループ化するため、groupbyは正しくありません。

あなたが値をフィルタリングするカウンタと2つのリストの内包表記を使用することができ

list_of_values = [2.0, 2.0, 2.0, 2.0, 0, 0, 3.0, 2.0, 2.0, 2.0, 10.0, 0, 0] 
threshold_value = 1.0 
minimum_count = 4 

from collections import Counter 
counter = Counter([x for x in list_of_values if x > threshold_value]) 
print(counter) 
# Counter({2.0: 7, 3.0: 1, 10.0: 1}) 
print([(x, count) for x, count in counter.items() if count > minimum_count]) 
# [(2.0, 7)] 
関連する問題