我有列表包含其他列表(仅限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或更多次
答案 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)
进行比较。