Ocaml 检查列表中的元素
我举一个例子:Ocaml 检查列表中的元素,ocaml,Ocaml,我举一个例子: let l = [0;1;2] let l1 = [0;2] 从列表l检查l的某些元素是否属于l1;如果是,则返回一个配对列表,例如[(1,0);(1;2)]您到底想做什么? 计算l1中l中每个元素的出现次数 一个想法可能是问你自己,我如何为l的一个元素做到这一点? 为此,您可能希望创建一个具有以下签名的函数:nb\u mem:'a->'a list->int 然后,为了生成列表,您可以递归地进行 let rec check l l1 = match l with |
let l = [0;1;2]
let l1 = [0;2]
从列表
l
检查l
的某些元素是否属于l1
;如果是,则返回一个配对列表,例如[(1,0);(1;2)]
您到底想做什么?
计算l1
中l
中每个元素的出现次数
一个想法可能是问你自己,我如何为l
的一个元素做到这一点?
为此,您可能希望创建一个具有以下签名的函数:nb\u mem:'a->'a list->int
然后,为了生成列表,您可以递归地进行
let rec check l l1 =
match l with
| [] -> []
| e :: r -> let nb = nb_mem e l1 in
if nb = 0 then check r l1 else (nb,e) :: (check r l1)
当然,这并没有考虑到一个元素可能会在l
中多次出现,这远远不是最优的
一个想法可能是在开始之前对两个列表进行排序(如果您使用的是整数值,这很容易),以避免完全多次读取l1
您还可以使用包含
l1
中每个元素的出现次数的hashtbl
,然后通过读取l
中每个元素的相应条目来生成列表。为此,您应该遍历l中的每个元素。然后检查l的第一个元素是否是l1的元素。如果是,则过滤掉所有相等的元素。然后获取相等元素列表的长度,它将是元组中进入返回列表的第一个字符
let check_list l l1 =
let rec check l l1 combined =
match l with
|[] -> combined
|(h::t) -> if (List.mem h l1) then
check t l1 ((List.length(List.filter (fun x -> h=x) l1),h)::combined)
else check t l1 combined
in check l l1 []