Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Count how many values in a list that satisfy certain condition

Tags:

python

I have the following list,

mylist = ['0.976850566018849',
 '1.01711066941038',
 '0.95545901267938',
 '1.13665822176679',
 '1.21770587184811',
 '1.12567451365206',
 '1.18041077035567',
 '1.13799827821001',
 '1.1624485106005',
 '1.37823533969271',
 '1.39598077584722',
 '1.23844320976322',
 '1.57397155911713',
 '1.40605782943842',
 '1.36037525085048',
 '1.185',
 '1.22795283469963',
 '1.17192311574904',
 '1.04121940463022',
 '1.0133517787145',
 '0.986161470813006',
 '1.09820439504488',
 '1.06640283661947',
 '1.05764772395448',
 '1.02678616758973',
 '1.01876057166248',
 '1.09019498604372',
 '1.1665479238629',
 '1.07170094763279',
 '1.1326945725342',
 '1.18199297460235',
 '1.20353001964446',
 '1.00973941850665',
 '1.0662943967844',
 '1.04876624296406',
 '1.12447065457189',
 '0.954629674212134',
 '1.02961694279098']

What I want to do is to count how many values in that list which is >= 1.3. Returning 5, which is:

      '1.57397155911713' 
      '1.40605782943842'
      '1.36037525085048'
      '1.39598077584722' 
      '1.37823533969271'

Is there a compact way to do it in Python?

like image 701
pdubois Avatar asked Apr 07 '14 05:04

pdubois


2 Answers

I take compactness, you mentioned in the question, as shorter code. So, I present

sum(float(num) >= 1.3 for num in mylist)

This takes advantage of the fact that, in python True values are taken as 1 and False as 0. So, whenever float(num) >= 1.3 evaluates to Truthy, it will be 1 and if it fails, result would be 0. So, we add all the values together to get the total number of items which are greater than or equal to 1.3.

You can check that like this

True == 1
# True
True + True
# 2
False * 10
# 0
like image 182
thefourtheye Avatar answered Oct 19 '22 23:10

thefourtheye


You can use numpy or pandas, though for such a simple computation they would be much slower than the alternatives mentioned above.

Using numpy,

import numpy as np
arr=np.array(mylist).astype(float)
print len(arr[arr>=1.3])

Using pandas,

import pandas as pd
s=pd.Series(mylist).astype(float)
print len(s[s>=1.3])

Alternatively,

(pd.Series(l).astype(float)>=1.3).value_counts()[True]

For performance, the fastest solution seems to be

In [51]: %timeit sum(1 for x in mylist if float(x) >= 1.3)
100000 loops, best of 3: 8.72 µs per loop
like image 36
Sergey Orshanskiy Avatar answered Oct 19 '22 23:10

Sergey Orshanskiy