从另一个列表中减去一个列表的最简单方法是什么?我是否需要使用ListPair来解决此任务?我需要比较ROWS,而不是单个元素。例如,有两个列表“L1”和“L2”:
L1 =
[(1, 2, 3),
(4, 5, 6)]
L2 =
[(1, 2, 3),
(4, 5, 6),
(3, 2, 3]
我需要通过应用L3 = L2-L1
获得“L3”:
L3 =
[(3, 2, 3)]
感谢。
答案 0 :(得分:2)
据我所知,你想要删除L2中也在L1中的元素,但每次只发生一次。
一个简单的解决方案可能需要一个辅助函数来告诉你是否在L1中找到了一个元素,以及删除了该元素的L1的其余部分。
fun remFirst _ [] rest = (false, rev rest)
| remFirst x (y::ys) rest =
if x = y then
(true, rev rest @ ys)
else
remFirst x ys (y :: rest)
现在你可以迭代L2,每次remFirst返回true时丢弃元素,然后继续执行列表的其余部分。
如果您想要删除L2与L1共有的前缀,事情会变得更简单。
fun remPref [] _ = []
| remPref xs [] = xs
| remPref (x::xs) (y::ys) = if x = y then remPref xs ys else (x::xs)
更新:问题现已改变。
如果现在要求从L1中删除L1中的元素,则过滤器很有用。
List.filter (fn x => List.all (fn y => x <> y) L1) L2