2012-11-19 115 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