從另一個列表中減去一個列表最簡單的方法是什麼?我需要使用ListPair來解決這個任務嗎?請注意,我需要比較ROWS,而不是單個元素。舉例來說,有兩個列表 「L1」 和 「L2」:SML:從另一個列表中減去一個列表
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)]
感謝。
從另一個列表中減去一個列表最簡單的方法是什麼?我需要使用ListPair來解決這個任務嗎?請注意,我需要比較ROWS,而不是單個元素。舉例來說,有兩個列表 「L1」 和 「L2」:SML:從另一個列表中減去一個列表
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)]
感謝。
正如我所理解的問題,你想刪除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)
更新:問題現在已被改變。
如果現在要求從L2中刪除L1中的元素,則過濾器很有用。
List.filter (fn x => List.all (fn y => x <> y) L1) L2
謝謝,但我需要比較ROWS,而不是列表中的單個元素。 – 2011-12-21 19:39:46
你的問題從來沒有提到元組列表,但很好,我會適應我的答案。儘管如此,儘量更確切些。 – Sarah 2011-12-22 10:08:52
你想從L2中刪除也是L1中的元素,但是每個L1中只發生一次的元素是否正確? – Sarah 2011-12-21 09:53:18
如果L1不是L2的前綴,您打算如何處理? – 2011-12-21 10:21:54
它是正確的。但可能有多個事件,這些事件也應該被刪除。 – 2011-12-21 10:25:17