【问题标题】:How to get rid of sub lists of a list in a list in Haskell?如何摆脱 Haskell 列表中列表的子列表?
【发布时间】:2020-11-08 06:37:12
【问题描述】:

我是 Haskell 的新手,想知道如何执行以下操作:

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

如何摆脱所有子列表 ([1,2], [1,2,3]) 并仅获得 [[1,2,3,4]] 的结果?

【问题讨论】:

  • Data.List中使用isInfixOf
  • 我尝试了以下方法,第一个函数有效,但第二个函数导致错误,我可能遗漏了一些明显的东西。 subList :: [Int] -> [Int] -> Bool subList a b = if isSubsequenceOf a b then False else True filterOutSublists :: [[Int]] -> [[Int]] filterOutSublists (n1:n2:ns) = filter subList $ n1 n2 ++ filterOutSublists(n2:ns)
  • 如果它们不是彼此的子列表怎么办,例如L = [[1, 2], [3, 4]]呢?
  • XY 问题?或许一开始就不要生成这些短名单。
  • 如果您有更新,请edit您的问题,cmets 不是放置 Haskell 代码的好地方。

标签: list haskell


【解决方案1】:

如果我对问题的理解正确,解决方案可能如下:

import Data.List                                                               

-- Get only if element is not subsequence of any other x element                                                                             
filterOutSublists x = filter (not . (isSub)) x                                 
  where
    -- Check if given element is subsequence of any of x element                                                                     
    isSub y = foldl (\acc y' -> acc || (y `elem` (init $ subsequences y'))) False x

但是这个解决方案的 O(n) 复杂度非常差,所以对于长列表是没有用的。

【讨论】:

    【解决方案2】:

    您可以使用concat 来展平子列表,然后,由于您想去除重复项,您可以使用Data.Set 将其转换为集合并再次转换为列表-

    import qualified Data.Set as Set
    f = (:[]) . Set.toList . Set.fromList . concat
    

    输出

    λ> f [[1,2],[1,2,3],[1,2,3,4]]
    [[1,2,3,4]]
    λ> f [[1, 2], [3, 4]]
    [[1,2,3,4]]
    

    请注意,最后的 (:[]) 只是为了将最终结果放入一个周围的列表中,这就是您在示例中显示的内容 - 尽管我不太清楚这有什么意义。

    如果您希望结果只是一个列表而不是被另一个列表包围的列表,请删除 (:[]) 组合。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2023-04-05
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多