我有类似:[[x,y,z],[a,b,c],[x,b,c],[!x,a,o]]
(列表清单)
我想要删除所有包含我搜索的元素的列表,例如,如果我搜索x
我必须有类似[[a,b,c],[!x,a,o]]
的内容。
我知道如果它是一个简单的List,我将不得不这样做:
let funfilter elem l = List.filter (fun x -> x != elem) l;;
对于列表列表,我需要在过滤器或map
filter
内进行过滤。但我无法找到它的正确语法,我不确定这是否是我唯一需要删除列表的方法。
其他平行问题,如果我只想删除List列表中的元素,在这种情况下元素!x
- >结果[[a,b,c],[a,o]]
,我怎么认为这样做?
我有一个模糊的想法是Lis.filter
和/或List.filter
List.map
List.filter
------------------- EDIT ------------------------- <无线电通信/> 正如我在评论中所说,我做了一个名为head的函数来返回它在这样的列表上看到的1º元素
let head =
function
x::_ -> x
| _ -> failwith "no head?";;
和这个功能:
let funfilter elem ll =
List.filter (fun inner -> (List.exists (fun x -> x <> elem) inner)) ll;;
(我的名单列表名为 passalista )
然后我就做了 funfilter (head(head passalista)) passalista
在它旁边,我打印了我的 passalista ,值都是一样的。
我现在做错了什么? :■ 我需要澄清一些事情以使问题更容易吗?
答案 0 :(得分:2)
您需要List.mem
:
let funfilter elem xs =
List.filter (fun inner -> not (List.mem elem inner)) xs
其中elem
是您要用于过滤的元素,xs
是列表。
示例:
# let funfilter elem xs =
List.filter (fun inner -> not (List.mem elem inner)) xs;;
val funfilter : 'a -> 'a list list -> 'a list list = <fun>
# let passalista = [[1; 2]; [3; 2; 1]; [4]];;
val passalista : int list list = [[1; 2]; [3; 2; 1]; [4]]
# funfilter (List.hd (List.hd passalista)) passalista;;
- : int list list = [[4]]
更新:根据Anton Trunov的建议,将List.exists
替换为List.mem
。