过滤器
定义
过滤器的目的是只返回列表中给定谓词为true的值。
让 成为…的一个子集 而且 那么就成为一个函数吧
现在应该很明显,过滤器与a非常相似列表理解除非左边的表达式只是一个变量,没有别的。
因此[x | x<- L, f(x)]
差不多是一样的过滤器f L
.或在python中,[x for x in L if f(x)]
而且过滤器(f、L)
是等价的。
例子
从以下列表中筛选所有质数:
1 2 3 4 5Numbers_to_eval = [345748742, 352288653,985077200, 357507035, 520291774,729107087, 5450596013, 647346013, 474128848,430782065,1017154128, 613900692, 335923302, 446776157, 861310614, 555315083,705352600, 273035494, 457146240, 581163343]
Python
我们必须建造区分质数和合数的函数首先,。
1 2 3 4 5 6defisPrime(n):为我在范围(2,n):#从2到n-1如果n%我= =0:如果n除以I余数为0返回假其他的:返回真正的
现在,我们只需要给列表和函数提供filter:
1过滤器(isPrime,numbers_to_eval)
Haskell
1 2 3 4 5 6noDivsBy因素n=foldr(\fr->f*f>n||((快速眼动nf/ =0)& &r))真正的因素——primeNums = filter (noDivsBy [2..]) [2..]primeNums=2:3.:过滤器(noDivsBy$尾巴primeNums)[5,7..]isPrimen=n>1& &noDivsByprimeNumsn
一旦我们完成了,我们可以使用filter:
1过滤器(isPrime,numbers_to_eval)
Mathematica
Mathematica的事情非常简单:
1选择[numbers_to_eval,PrimeQ]
这就解释了filter。让我们看一个不同的例子。
对于从1到100的所有起始数,有多少冰雹链长度大于15?
我们需要的第一件事是找到一种方法来创建给定种子的链:
1 2 3 4 5链::(积分一个)= >一个->[一个]链1=[1]链n|甚至n=n:链(n`div`2)|奇怪的n=n:链(n*3.+1)
以下是我们可以得到长度大于15的序列:
1过滤器isLong(地图链[1..One hundred.])在哪里isLongxs=长度xs>15
变体
我们将讨论的两个主要变体过滤器
:dropWhile
而且分区
.我们会用概念来定义它们过滤器
我们在整篇文章中进行了发展。
dropWhile
dropWhile
恰恰相反过滤器
.它会丢弃与谓词匹配的所有内容。
1dropWhilefl=过滤器不.fl
分区
分区
将列表分成两个部分:匹配谓词的部分和不匹配谓词的部分。
1分区pxs= =(过滤器pxs,过滤器(不.p)xs)
引用:过滤器。Brilliant.org.检索从//www.parkandroid.com/wiki/filter/