簡體   English   中英

從 Haskell 中的列表中刪除重復項

[英]removing duplicates from a list in haskell

我正在嘗試刪除列表中的連續重復項; 例如,給定列表[1,2,2,3,4] ,我需要的函數必須返回[1,3,4]

但是,如果尾隨重復項在列表中(例如[1,2,3,4,4] ,我在問題末尾的代碼將不起作用。

我也想用盡可能簡單的術語來做,我該怎么做?

myCom :: Eq a => [a] -> [a]
myCom (x:y:ys@(z:_))
    | x == y    =  myCom ys
    | otherwise = x  : myCom (y:ys)
myCom ys = ys

您的第一個模式匹配只捕獲包含至少 3 個元素的列表。 這就是為什么當重復項位於列表末尾時

myCom [4,4] 

被稱為它只是使用

myCom ys = ys

並返回自身。 您可以通過為至少包含以下 2 個元素的列表定義 myCom 來捕捉這一點(無論如何您都沒有使用 z ):

myCom (x:y:ys)
  | x == y    =  myCom ys
  | otherwise = x  : myCom (y:ys)
myCom ys = ys

這給

myCom [1,2,2,3,4,4] = [1,3]

3 個(奇數)連續數字仍然存在問題。 例如我們得到:

myCom [1,2,2,2] = [1,2]

但我明白這是理想的行為。

我會使用Maybe將長度為 1 表示為成功條件。 這適用於 Haskell 的模式匹配語法。 然后,您可以使用group (來自 Data.List)並使用catMaybe (來自 Data.Maybe)過濾掉Nothing s:

myCom = catMaybes . map lenOne . group
  where lenOne [x] = Just x
        lenOne _   = Nothing

從評論中我看到函數Data.Set.nub只是按照 OP 的要求執行操作。

然而,我第一次嘗試解決這個問題如下,它只刪除連續的重復項(例如[1,2,1,2,1,2]沒有改變):

concat $ filter (\x -> length x == 1) $ Data.List.group [1,2,3,4,4]

我希望這個答案對最終出現在此頁面上的一些隨機用戶有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM