Python 计算列表中有多少个满足特定条件的值
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22904380/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Count how many values in a list that satisfy certain condition
提问by pdubois
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.3 的值。返回 5,即:
'1.57397155911713'
'1.40605782943842'
'1.36037525085048'
'1.39598077584722'
'1.37823533969271'
Is there a compact way to do it in Python?
有没有一种紧凑的方法可以在 Python 中做到这一点?
采纳答案by thefourtheye
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
.
这利用了这样一个事实,即在 Python 中True
值被视为 1 和False
0。因此,无论何时float(num) >= 1.3
评估为真,它都会是1
,如果失败,结果将为 0。因此,我们将所有值加在一起以获得大于或等于 的项目总数1.3
。
You can check that like this
你可以像这样检查
True == 1
# True
True + True
# 2
False * 10
# 0
回答by YS-L
To count how many values in that list which is >= 1.3:
要计算该列表中有多少个 >= 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)
回答by Rahul Tripathi
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 compactbut 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)
回答by pygaur
by using list comprehension
通过使用列表理解
>>> len([i for i in mylist if float(i) >= 1.3])
回答by nothisispatrick11
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))
回答by osa
You can use numpy
or pandas
, though for such a simple computation they would be much slower than the alternatives mentioned above.
您可以使用numpy
或pandas
,但对于如此简单的计算,它们会比上面提到的替代方法慢得多。
Using numpy,
使用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
回答by twalberg
Here's an alternative, using the reduce()
builtin:
这是使用reduce()
内置函数的替代方法:
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)...
只是为了完整性,因为我看到已经有一个公认的答案。关键是,在 Python(或许多其他语言,就此而言)中,通常有不止一种方法可以完成某些事情......