List 如何在Haskell中除去列表中列表的子列表?
我是Haskell的新手,想知道如何做到以下几点:List 如何在Haskell中除去列表中列表的子列表?,list,haskell,List,Haskell,我是Haskell的新手,想知道如何做到以下几点: L = [[1,2],[1,2,3],[1,2,3,4]] 如何去掉所有子列表([1,2],[1,2,3]),只得到[[1,2,3,4]的结果?如果我正确理解问题,解决方案如下: import Data.List -- Get only if element is not subsequence of any oth
L = [[1,2],[1,2,3],[1,2,3,4]]
如何去掉所有子列表(
[1,2],[1,2,3]
),只得到[[1,2,3,4]
的结果?如果我正确理解问题,解决方案如下:
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)复杂度非常差,因此它对于长列表是无用的。您可以使用
concat
来展平子列表,然后,由于您想消除重复项,您可以使用Data.Set
将其转换为集合,然后再转换回列表-
导入符合条件的数据。设置为Set
f=(:[])。集合,托利斯。Set.fromList。海螺
输出
λ>f[[1,2],[1,2,3],[1,2,3,4]]
[[1,2,3,4]]
λ> f[[1,2],[3,4]]
[[1,2,3,4]]
请注意,最终的(:[])
只是将最终结果放在一个周围的列表中,这就是您在示例中所展示的内容,尽管我甚至不知道这是什么意思
如果希望结果只是一个列表,而不是被另一个列表包围的列表,请删除
(:[])
组合。在数据中使用isInfixOf
。list
我尝试了以下方法,第一个函数可以工作,但第二个函数会导致错误,我可能遗漏了一些明显的东西。子列表::[Int]->[Int]->Bool子列表a b=如果a b的发行顺序为False,则为False,否则为True FilterOutSubList::[[Int]]->[[Int]]FilterOutSubList(n1:n2:ns)=FilterSubList$n1 n2++FilterOutSubList(n2:ns)如果它们不是彼此的子列表,例如L=[[1,2],[3,4]
?XY问题?也许首先不要生成这些短列表。如果您有更新,请回答您的问题,注释不是放置Haskell代码的好地方。