2012-11-19 46 views
1

我有一个列表列表,例如, [[1,1,3],[1,2,4],[4,4,4],[5,6,7]]基于过滤器输出的过滤器

我想删除所有具有重复元素的列表,例如返回[[1,2,4],[5,6,7]]

我目前的问题是为我的应用程序filter创建一个谓词。 我目前正在尝试根据该列表的预期长度测试已过滤列表的长度。但是,我努力让它在list的元素上起作用。

removeLoops :: [[Integer]] -> Integer -> [[Integer]] 
removeLoops list vs = filter (genericLength(filter (==)) < vs) list 

我吠叫错了树吗?或者只是对谓词的误解?

+0

我真的不明白你在这里做什么。您有重复的条件是删除重复项后列表的长度是否减少?请注意'filter(==)'不会删除重复项。有一个函数'nub'。虽然检查一个列表是否有重复,但更容易删除它们。你不应该用后者来做前者,以提高效率。 –

+0

子列表是否总是排序?如果是这样,您可以使用'hasDups xs =或$ zipWith(==)xs(tail xs)'检查重复项。 – hammar

回答

3

我认为解决方案比您想象的要简单。你可以用它测试一个给定的名单是否有重复的谓词过滤列表:

ls = [[1,1,3],[1,2,4],[4,4,4],[5,6,7]] 
filtered = filter hasNoDuplicates ls 

然后,所有剩下的就是要找到一个合适的谓语。在这种情况下,nub函数派上用场。这个函数接受一个列表,并返回没有重复的列表。所以你可以说:

import Data.List (nub) 

hasNoDuplicates l = l == nub l 
2

这应该适合你。

removeListsWith重复使用帮助器hasDuplicates来过滤列表的列表。简单。

removeListsWithDuplicates :: [[Integer]] -> [[Integer]] 
removeListsWithDuplicates ls = filter (not . hasDuplicates) ls 

hasDuplicates。一个空的列表没有重复。如果第一个元素在列表的其余部分重复,或者列表的其余部分有其他重复元素,则包含多个元素的列表只有重复。

hasDuplicates :: [Integer] -> Bool 
hasDuplicates [] = False 
hasDuplicates (x:xs) = any (==x) xs || hasDuplicates xs