从列表中删除其他列表

时间:2017-10-16 13:00:44

标签: lisp common-lisp clisp

我有列表包含其他列表(仅限2个级别)

((S U S U R) (S U S R) (S U R))

如何从列表中删除包含一些对的列表,列表中第一个和第二个位置上的2个元素的相同组合或第3个和第4个位置(在我的示例中为#34; S U")并返回((S U S R) (S U R))

我需要转换

((S U S U R) (S U S R) (S U R)) to => ((S U S R) (S U R))

((S U R S U) (S U S R) (S U R)) to => ((S U R S U) (S U S R) (S U R)) - 不要改变,因为这里的对有S U,R S,U且没有S U 2或更多次

1 个答案:

答案 0 :(得分:2)

REMOVE-IF

(remove-if #'oddp '(1 2 3 4 5))
=> (2 4)

LAMBDA

(funcall (lambda (x) (string x)) :example)
=> "EXAMPLE"

EQUALP

(equalp '(S U) (list 's 'u))
=> T

SUBSEQ

(subseq '(a b c d) 0 3)
=> (A B C)

小心:

(subseq '(a b c d) 0 10)
=> ERROR

您还可以使用LENGTH来获取列表的大小。您还可以使用以下功能...

NTHCDR

(nthcdr '(s u s u r u) 5)
=> (U)

LDIFF

(let ((list '(a b c d)))
  (ldiff list (nthcdr 10 list)))
=> (A B C D)

(let ((list '(a b c d)))
  (ldiff list (nthcdr 2 list)))
=> (A B)

你想做什么

您希望从输入列表中删除满足以下谓词的元素:给定列表,此列表的子集等于(S U) (请参阅注释)

您的代码如下所示:

(defun remove-s-u-at-pos-3 (list)
  (remove-if (lambda (...) ...) list))

您需要提取每个访问列表的一部分,并将其与(S U)进行比较。