统计一个列表中满足特定条件的值的数量

13

我有以下列表:

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']

我想做的是统计列表中大于等于1.3的值有多少个。 返回5,即:

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

有没有一种简洁的方法在Python中实现它?


1
为什么它必须要紧凑? - Lennart Regebro
有没有一种不那么紧凑的方法来做到这一点? - devnull
这个回答解决了你的问题吗?python:使用特定条件从列表(序列)中获取项目数量 - sophros
7个回答

18

我认为你在问题中提到的紧凑性,指的是代码更短。因此,我呈现

sum(float(num) >= 1.3 for num in mylist)
这利用了Python中的一个事实,即True被视为1,False被视为0。因此,每当float(num) >= 1.3评估为"真值"时,它将是1,如果不成功,则结果将为0。因此,我们将所有值相加以获得大于或等于1.3的物品总数。

您可以这样检查

True == 1
# True
True + True
# 2
False * 10
# 0

7

要计算列表中值>=1.3的数量:

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

如果您需要实际提取满足条件的数字列表,只需使用列表推导式创建该列表,并对其进行任何操作:
a = [x for x in mylist if float(x) >= 1.3]
print a
print len(a)

2
您可以使用生成器表达式。
一些简单的生成器可以用表达式编码,其语法类似于列表推导式,但是使用圆括号而不是方括号。这些表达式适用于生成器被封闭函数立即使用的情况。生成器表达式比完整的生成器定义更紧凑,但功能较少,并且比等效的列表推导式更节省内存。
就像这样:
sum(1 for x in mylist if float(x) >= 1.3)

@thefourtheye 在每个答案上留下相同的“小费”似乎并不是很有建设性。还不如自己写一个答案。 - devnull
@devnull 对不起,我会把它们删除。 - thefourtheye

1
如果您希望将值返回并存储在列表中,可以执行以下操作:
count = []
for value in mylist:
    num = float(value)
    if num >= 1.3:
        count.append(value)

如果你想输出列表,只需添加以下内容:

print(count)

或者,如果你想要大于某个值的数量,请添加:

print(len(count))

1
你可以使用 numpypandas,但对于这样一个简单的计算,它们比上述替代方案慢得多。
使用 numpy
import numpy as np
arr=np.array(mylist).astype(float)
print len(arr[arr>=1.3])

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

或者,

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

为了提高性能,最快的解决方案似乎是:


In [51]: %timeit sum(1 for x in mylist if float(x) >= 1.3)
100000 loops, best of 3: 8.72 µs per loop

1
这里有一种使用内置函数reduce()的替代方法:
reduce(lambda x, y: x + (y >= 1.3), mylist, 0)

仅为完整性,因为我看到已经有了一个被接受的答案。关键是,在Python(或其他许多语言)中通常有多种方法可以完成某个任务...


0

通过使用列表推导式

>>> len([i for i in mylist if float(i) >= 1.3])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接