[英]Filter a list of tuples on two conditions
我有一个看起来像这样的元组列表:
let tups = [("AA","BB",1),
("AA","CC",2),
("AA","BB",3),
("VV","RR",4),
("XX","TT",5),
("BB","BB",6)]
我只想在第一个元素是AA
而第二个元素是BB
过滤掉元组。 我正在尝试使用:
filter (\(x,y,_) -> x /= "AA" && y /= "BB") tups
上面的命令删除第一个元素为“ AA”或第二个元素为“ BB”的任何元组。 因此,输出为:
[("VV","RR",4), ("XX","TT",5)]
如何创建过滤器功能以仅删除第一个元素为“ AA”且第二个元素为“ BB”的元组? 正确的输出应为:
[("AA","CC",2), ("VV","RR",4), ("XX","TT",5), ("BB","BB",6)]
布尔代数。 您要删除的满足条件
x == "AA" && y == "BB"
布尔代数指出
¬(x and y) = ¬x or ¬y
因此,您的lambda的条件应为
x /= "AA" || y /= "BB"
因为filter
保留提供的谓词返回True
。
如您在文档中所读, filter ::(a-> Bool)-> [a]-> [a]返回满足谓词的那些元素的列表。 这意味着谓词只对要保留的元素返回True
。
因此,通过改写您的请求,我们希望保留所有第一个元素与“ AA”不同或第二个元素与“ BB”不同的三元组:
filter (\(x,y,_)-> x /= "AA" || y /= "BB" ) tups
如果您想要使自己的意图更加明确的方法,请尝试:
filter (\(x,y,_) -> not $ x == "AA" && y == "BB") tups
filter (\(x,y,_) -> x /= "AA" || y /= "BB") tups
会做你想做的事。 您混淆了&&
和||
操作员。 过滤器将获取谓词为true的所有内容,因此返回不包含"AA"
所有内容,并且返回y
不为“ BB”的所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.