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

13 投票
7 回答
37333 浏览
提问于 2025-04-18 01:40

我有以下这个列表,

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中做到这一点?

7 个回答

1

这里有一个替代方案,使用内置的 reduce() 函数:

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

为了完整起见,因为我看到已经有一个被接受的答案。关键是,在Python(或者其他很多语言)中,通常有不止一种方法可以完成某件事……

1

如果你想把返回的值存储在一个列表里,可以这样做:

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

如果你想让它输出这个列表,只需要加上:

print(count)

或者如果你想知道有多少个值是大于某个数的,可以加上:

print(len(count))
2

你可以使用一种叫做生成器表达式的东西。

一些简单的生成器可以用一种类似于列表推导式的语法来简洁地编写,不过是用圆括号而不是方括号。这种表达式主要用于生成器被外部函数立即使用的情况。生成器表达式更紧凑,但不如完整的生成器定义灵活,而且在内存使用上通常比等效的列表推导式更友好。

像这样:

sum(1 for x in mylist if float(x) >= 1.3)
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)
18

我理解你提到的“紧凑性”是指代码要简短。所以,我给你展示一下:

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

这里利用了Python中的一个特点:在Python里,True的值被当作1,而False的值被当作0。因此,每当float(num) >= 1.3这个条件成立时,它就会返回1,如果不成立,就返回0。我们把所有这些值加起来,就能得到大于或等于1.3的总数。

你可以这样检查结果:

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

撰写回答