2016-10-08 25 views
-1

私はそう特定の値の範囲内でどのように数値の範囲を合計しますか?

nums = [2.5, 1, 9, 9.9, 1.6, 5.4, 3.2, 4.4, 4, 5.2, 5, 6] 

のような値の配列が特定の値の間にある、この配列内のすべての値を合計するニシキヘビの方法はありますか?たとえば、私の範囲が2.5-6だった場合、私は2.5 + 5.4 + 3.2 + 4.4 + 4 + 5.2 + 5 + 6 = 35.7を得ると予想します。私もこれを解決するためにnumpyを使用することにオープンしています。

+0

いかなる理由が? – Giovanni

答えて

6

誰もあなたが行くここで、まだnumpyのソリューションを提供しなかったので:

>>> nums = np.array([2.5, 1, 9, 9.9, 1.6, 5.4, 3.2, 4.4, 4, 5.2, 5, 6]) 
>>> nums[(2.5 <= nums) & (nums <= 6)].sum() 
35.700000000000003 

が、私はいくつかの簡単なテストを試みたが、私は多くの速度の利点があることはよく分かりません。

+0

ありがとう!これは私の場合はうまくいく。 – Giovanni

2
>>> nums = [2.5, 1, 9, 9.9, 1.6, 5.4, 3.2, 4.4, 4, 5.2, 5, 6] 
>>> sum([n for n in nums if 2.5 <= n <= 6]) 
35.7 
>>> 2.5 + 5.4 + 3.2 + 4.4 + 4 + 5.2 + 5 + 6 
35.7 
+1

'sum(nはn個のnums ...)'の上で 'sum(nはnum ...のnの場合は...)'を推奨します。前者はメモリを節約する[ジェネレータ式](https://www.python.org/dev/peps/pep-0289/)を作成します。 – Praveen

+1

可読性のために '' n <= n <= 6なら 'n <= n <= 6なら' 'n= 2.5'を好む – Eric

0
sum(filter(lambda x: x>=2.5 and x<=6,nums)) 
+0

は理解の上でフィルタリングとラムダの利点がありますか? –

+0

@JamesK:いいえ、ありません – Eric

1

さて、あなたはあなたの変数を持っていると仮定minmaxセットすることができます。次に、入力できます。

min = 2.5 
max = 6 
sum = sum(i if i>=min and i<=max else 0 for i in nums) 

Greets!

1
またソートし、リストのスライスを合計する見つけるために二分することによって行うことができ

>>> nums = [2.5, 1, 9, 9.9, 1.6, 5.4, 3.2, 4.4, 4, 5.2, 5, 6] 
>>> nums.sort() 
>>> import bisect 
>>> min = 2.5 
>>> max = 6 
>>> sum(nums[bisect.bisect_right(nums, min)-1:bisect.bisect_left(nums, max)+1]) 
35.7 
1

使用masked_outside():downvoteのため

import numpy as np 
nums = [2.5, 1, 9, 9.9, 1.6, 5.4, 3.2, 4.4, 4, 5.2, 5, 6] 
np.ma.masked_outside(nums, 2.5, 6).sum() 
関連する問題