List 过滤两个列表f#
我有两个字符串列表,一个包含满足某些条件的HumanID(humanosPosibles),另一个列表包含可能满足或不满足这些条件的HumanID(likesTodo)。问题是,我需要创建一个列表,其中只包含likesTodo中的HumanSID以及humanosPosibles中的HumanSID。我试着用递归和list.filter来实现它。我会把我的代码给你看看我做错了什么。如果你认为这不是最好的方法,请提出建议List 过滤两个列表f#,list,recursion,filter,f#,List,Recursion,Filter,F#,我有两个字符串列表,一个包含满足某些条件的HumanID(humanosPosibles),另一个列表包含可能满足或不满足这些条件的HumanID(likesTodo)。问题是,我需要创建一个列表,其中只包含likesTodo中的HumanSID以及humanosPosibles中的HumanSID。我试着用递归和list.filter来实现它。我会把我的代码给你看看我做错了什么。如果你认为这不是最好的方法,请提出建议 let rec pasa (likesTodo:string list)
let rec pasa (likesTodo:string list) (humanosPosibles:string list) x y =
if (y < humanosPosibles.Length) then
if (likesTodo.[x] = humanosPosibles.[y]) then
true
else
pasa likesTodo humanosPosibles x (y+1)
else
false
let genteFiltrada = List.filter (fun x -> pasa likesTodo humanosPosibles 0 0 ) likesTodo
让rec pasa(likesTodo:string list)(humanosPosibles:string list)x y=
如果(ypasa likesTodo humanosPosibles 0)likesTodo
genteFiltrada对应于我需要创建的列表。上一次我忘了说,如果有一项likesTodo重复,我需要它在新列表中出现两次。因此,set不起作用 这里是一个使用set的解决方案,因为您需要的是交点:
let intersectlists a b =
let la,lb = Set.ofList a, Set.ofList b
Set.intersect la lb |> Set.toList
可以稍微短一点:
让IntersectList a b=(Set.ofList a,Set.ofList b)| |>Set.intersect |>Set.toList.toList
我有一个问题,如果列表中的一个项目像Estodo重复了好几次,并且它也在humanosPosibles列表中找到,它将被添加一次,或者多次添加到新列表?@Tomas—set
的工作方式,它将为您删除重复项。@JohnPalmer如果我需要重复项,该怎么办!哈哈