繁体   English   中英

在两个条件下过滤元组列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM