filter函数多对多的用法(filter函数如何添加多个条件)
python中的filter函数怎么用
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
例如,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:
def is_odd(x):
return x % 2 == 1
然后,利用filter()过滤掉偶数:
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
结果:
[1, 7, 9, 17]
利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:
def is_not_empty(s):
return s and len(s.strip()) 0
filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
结果:
['test', 'str', 'END']
注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。
当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' '),如下:
a = ' 123'
a.strip()
'123'
a = '\t\t123\r\n'
a.strip()
'123'
练习:
请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
方法:
import math
def is_sqr(x):
return math.sqrt(x) % 1 == 0
print filter(is_sqr, range(1, 101))
结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
js中filter过滤用法总结
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
| 参数 | 描述 |
| function(currentValue, index,arr) | 必须。函数,数组中的每个元素都会执行这个函数
函数参数:
| 参数 | 描述 |
| currentValue | 必须。当前元素的值 |
| index | 可选。当期元素的索引值 |
| arr | 可选。当期元素属于的数组对象 |
|
| thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。
如果省略了 thisValue ,"this" 的值为 "undefined" |
首先回顾一下filter的作用:过滤数组中符合条件的元素
另外也可以用来过滤对象数组中符合条件的对象,eg:
|
目前比较常用的方法是使用ES6的set完成,eg:
结合map使用可以先过滤出符合条件的对象然后去除某些不需要的字段,比如:
简单讲filter就是一个数组过滤器,参数接收一个函数,数组的每一项经过函数过滤,返回一个符合过滤条件的新数组
函数接收三个参数:
Excel技巧之FILTER函数
在以下示例中,我们使用公式 =FILTER(A5:D20,C5:C20=H2,"") 返回包含“苹果”(如单元格 H2 中所选定)的所有记录,如果没有“苹果”,则返回空字符串 ("")。
示例
用于返回多个条件的 FILTER
在此示例中,我们使用乘法运算符 ( ),以返回数组范围 (A5:D20) 中包含“苹果”且位于东部区域的所有值:=FILTER(A5:D20,(C5:C20=H1) (A5:A20=H2),"")。
Office 365新增的Filter查询函数,完爆Vlookup函数
VLOOKUP函数是我们在日常工作中使用频率非常高的一查询函数,我们可以用VLOOKUP函数,根据一个查询条件,比如员工编号,找到该员工在人事信息表中的部门、职务等信息,也可以在工资表中找到其对应的工资数据。
VLOOKUP很实用,不过它有三大缺点:
01 只能根据左侧的查询条件返回右侧的结果
比如下图所示的这个表格,我们可以根据员工编号找到员工姓名,但是如果想要用VLOOKUP函数根据员工姓名查询员工编号,是做不到的,除非结合到IF函数形成虚拟表。
02 无法直接屏蔽查询不到返回的#N/A的结果
如果查询结果中有很多查找不到的数据,就会出现大量的#N/A的错误信息,想要隐藏这些#N/A,必须要结合到IFERROR函数。
03 无法直接实现多条件查询
必须建立辅助列或者通过数组公式的方法来实现。
04 无法一次带出符合查询条件的多个结果
比如将上一张图左侧的表格的数据,按照订单编号的条件,展示所有A订单的商品型号到金额的数据到下图所示的表格中。需要结合到MATCH函数,通过复杂的函数嵌套才能实现。
而如果你使用的Office是365的版本,就可以利用365中新增的FILTER函数,既可以实现现有VLOOKUP函数具备的功能,还可以实现刚刚提到的VLOOKUP做不到的四项功能。
我们先来来看看FILTER的语法:
FILTER(数据区域,筛选条件,[无满足条件的记录时返回的值])
现在我们通过一些案例来系统学习FILTER函数的用法。
单条件查询也就是实现VLOOKUP函数的功能。比如下图中我们需要根据员工编号查询员工姓名,只需要输入函数:
=FILTER(B2:B11,A2:A11=D3,"")
第一个参数B2:B11是需要返回的结果列,这个参数可以是一列也可以是多列。第二个参数A2:A11=D3是筛选条件,等号左侧的是数据源表中的条件范围列,右侧则是结果列中的查询条件。第三个参数是如果找不到符合条件的数据的返回结果,这里输入的""表示空。
因为FILTER函数不像VLOOKUP函数那样,必须将条件列和结果列都包含到数据区域中,这样我们就可以任意选择结果列,也就可以解决VLOOKUP不能实现逆向查询的问题。
而且也不用借助IFERROR函数隐藏查找不到时返回的#N/A的错误信息了。
当有多个查询条件时,用“+”表示条件“或”,“或”是指多个条件中只要一个满足的情况;用“*”表示条件“与”,“与”是指多个条件必须同时满足的情况。
比如下图所示的案例,我们要查询A订单中1847这款商品的销售额,这就是与的情况,多个条件需要同时满足。这里输入的公式是:
=FILTER($H$2:$H$15,($A$2:$A$15=J2)*($D$2:$D$15=K2),"")
每个条件放在一对()中,中间用*号连接,可以继续往后连接条件。
如果想要一次返回符合条件的多列的数据,可以在第一个参数中选择多列。比如下图所示的这个案例。
这里第一个参数我们输入的是2列的数据,这样返回的结果就有2列,而通过+号则表示符号条件的数据有2个,这样返回结果就有2行2列。我们无须选择像以前数组公式那样选择多行多列,只需要将光标放在一个单元格中,比如这里的D3单元格,公式会自动将结果扩展到右侧和底部。
而且使用Filter函数我们都不需要使用绝对引用,因为它们仅存在于一个单元格中,并将其结果溢出到相邻单元格。
我们再用这个案例用动图感受一下FILTER函数的强大之处。
当我们改变订单编号的条件,底部的数据就会动态更新。
这个Office 365新增的Filter查询函数,是不是完爆Vlookup函数呢?
DAX从入门到精通 3-4-1 了解filter函数
filter函数很简单:传入一个表格,然后返回一个和原来列相同的表格,但是只会保留符合条件的行。
filter的语法如下:
filter函数对table进行迭代,每行都会判断是否符合条件,然后返回布尔值。当条件为true的时候,filter返回该行,否则跳过。
注意:
从逻辑角度出发,filter函数对table表每行执行条件判断。但是DAX内部在执行判断的时候,会使用优化的处理方式,会使用对列去重的方式来减少判断的数量。判断的数据,实际上是等于filter函数处理表的粒度。这个粒度情况决定的了filter函数的性能,这个也是一个DAX优化的一个重要点。
例如,下面这个查询只选择brand = "Fabrikam":
可以在filter函数内嵌套filter函数,因为可以使用一个表函数来作为filter的参数。filter首先执行的是最内部的filter,通常,嵌套两个过滤器会产生相同的结果和使用AND函数中包含的逻辑条件的组合相同。也就是,下面的语句会得到相同的结果:
但是,这两个公式在table表含有非常多行或者非常复杂的时候,性能会有很大的差距。例如下面这个查询,返回价格是成本三倍的fabrikm的产品。
这样的查询会把两个条件都添加到product表的所有行进行判断。因此,你可以更改下,如果你有两个条件,其中一个运行更快且更容易,你可以使用filter的嵌套形式,先处理这个过滤条件。例如。下面的查询,先过滤了price和cost,然后再过滤brand = ‘Fabrikam’,最终达成结果。
如果你调整一下顺序,那么执行的顺序也调整了。如下的先过滤了‘Fabrikam’,然后再过滤price和cost。
这点对于DAX表达式的优化非常有用。你可以选择先运行更高效的过滤条件。但是,在没有完全掌握上下文的时候,不要开始使用这种方法来优化语句。在第16章中,我们会深入的讨论这个优化。这个案例的作用只是让你意识到嵌套时候的运算顺序。
划重点:
通常情况下,对于嵌套的函数,顺序总是从最内部开始然后向外到最外部。但是calculate和calculatetable不同,这个是因为对于参数的特殊评估条件。很多情况下,我们会在相似的情况下使用filter和calculatetable函数,使用的时候我们要注意它们的区别。
filter函数的用法是什么?
filter函数的用法,下面进行举例说明:
例如一个公司,需要找出年销售额超过2000万的城市销售金额,这个利用简单的表达式已无法解决,根据FILTER来实现。
1、销售总额 = sum('销售明细'[销售额])
2、再建一个度量值[大于2000万的城市销售金额]= CALCULATE([销售总额],FILTER(ALL('门店城市'),[销售总额]20000000))。
3、超过2000万销售额的城市的销售额总计等于451026000,但发现上面明细的两个数字之和并不等于总计,这正是PowerBI中数据模型的特点。
一、Filter新增加的功能包括:
1、新的国际化。
2、应用程序生命周期事件控制。
3、澄清了类的装载规则。
4、新的错误及安全属性。
5、不赞成使用HttpUtils 类。
6、各种有用的方法。
二、一个filter必须实现javax.servlet.Filter的三个方法:
1. void setFilterConfig(FilterConfig config) //设置filter 的配置对象。
2. FilterConfig getFilterConfig() //返回filter的配置对象。
3. void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) //执行filter 的工作。