我有两个清单。 L1 ='((8 6 8 7 8 8)(8 7 7 6 8 7))
L2 ='((P(QR))(Q(PU))(R(TQS))(S(RUQ))(T(PQ))(U(RP)))
对于L2中的每个元素,我想用L1列表中的相应元素替换它。
L2中的每个P应该被L1
中每个子列表的第一个元素替换L2中的每个Q都应该被L1
中每个子列表的第二个元素替换L2中的每个R都应该被L1
中每个子列表的第3个元素替换L2中的每个S应该被L1中每个子列表的第4个元素替换
L2中的每个T应该被L1中每个子列表的第5个元素替换
L2中的每个U都应该被L1
中每个子列表的第6个元素替换根据第一个子列表,得到的L2是'((8(6 7))(6(8 8))(8(8 6 7))(7(8 8 6))(8 (8 6))(6(8 8))
setq L1 '(( 8 6 8 7 8 8 ) ( 8 7 7 6 8 7))
setq L2 '( (P (Q R)) (Q (P U)) (R( T Q S)) (S (R U Q)) (T( P Q ) (U( R P)) )
(dolist(ele L1)
(dolist(ele2 L2)
(progn (substitute (nth 0 L1) 'p ele2)(substitute (nth 1 L1) 'q ele2)
(substitute (nth 0 L1) 'r ele2)(substitute (nth 0 L1) 's ele2)
(substitute (nth 0 L1) 't ele2)(substitute (nth 0 L1) 'u ele2))))
谢谢
答案 0 :(得分:0)
我不确定你的例子,但这可能会让你开始:
(defun f (mapvals sxp)
(let ((mapping nil))
(labels
((sub (sxp) ; local function - recursive tree traversal
(cond
((null sxp) nil)
((consp sxp) (cons (sub (car sxp)) (sub (cdr sxp))))
(t ; we have an atom, so let's replace it
(let ((val (assoc sxp mapping))) ; look up the mapping of the atom
(if val ; mapping exists?
(cdr val) ; yes, use associated value
(let ((newval (pop mapvals))) ; no, pop next value from mapvals
(setf mapping (cons (cons sxp newval) mapping)) ; and remember mapping
newval)))))))
(sub sxp))))
测试:
? (f '(1 2 3 4 5 6)
'((P (Q R)) (Q (P U)) (R (T Q S)) (S (R U Q)) (T (P Q)) (U (R P))))
((1 (2 3)) (2 (1 4)) (3 (5 2 6)) (6 (3 4 2)) (5 (1 2)) (4 (3 1)))