13

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?

pdubois
  • 7,640
  • 21
  • 70
  • 99

7 Answers7

18

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
thefourtheye
  • 233,700
  • 52
  • 457
  • 497
7

To count how many values in that list which is >= 1.3:

sum(1 for x in mylist if float(x) >= 1.3)

If you need to actually extract the list of numbers which satisfy the condition, just create that list with a list comprehension and do whatever you want with it:

a = [x for x in mylist if float(x) >= 1.3]
print a
print len(a)
YS-L
  • 14,358
  • 3
  • 47
  • 58
2

You can use a generator expression

Some simple generators can be coded succinctly as expressions using a syntax similar to list comprehensions but with parentheses instead of brackets. These expressions are designed for situations where the generator is used right away by an enclosing function. Generator expressions are more compact but less versatile than full generator definitions and tend to be more memory friendly than equivalent list comprehensions.

Something like this:

sum(1 for x in mylist if float(x) >= 1.3)
Rahul Tripathi
  • 168,305
  • 31
  • 280
  • 331
1

If you want the values returned to you and stored in a list you could do:

count = []
for value in mylist:
    num = float(value)
    if num >= 1.3:
        count.append(value)

If you want it to output the list just add:

print(count)

or if you want the count of the number of values that are greater add:

print(len(count))
NoThisIsPatrick
  • 134
  • 2
  • 11
1

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
Sergey Orshanskiy
  • 6,794
  • 1
  • 46
  • 50
1

Here's an alternative, using the reduce() builtin:

reduce(lambda x, y: x + (y >= 1.3), mylist, 0)

Just for completeness, since I see there's already an accepted answer. The point is, there's often more than one way to accomplish something in Python (or many other languages, for that matter)...

twalberg
  • 59,951
  • 11
  • 89
  • 84
0

by using list comprehension

>>> len([i for i in mylist if float(i) >= 1.3])
Prashant Gaur
  • 9,540
  • 10
  • 49
  • 71