handasa 发表于 2022-7-5 16:14:59

合并主控形状的两个子列表

大家好。。。
 
我有一个由子列表组成的列表
(
(B1 B2)
(B3 B4)
(B5 B6)
)
 
我需要一种方法来合并它们的两个子列表,比如:(B1 B2)(B3 B4)一起成为
(B1 B2 B3 B4)
 
最终的主列表如下所示
(
(B1 B2 B3 B4)
(B5 B6)
)
 
函数应该由我需要合并的两个子列表的“n”位置提供。。。
 
谢谢并致以最良好的问候

Lee Mac 发表于 2022-7-5 16:29:53

假设结果应出现在最高索引处:
(defun mergesublists ( idx lst / i l m )
   (setq m (apply 'max idx)
         i -1
   )
   (vl-remove nil
       (mapcar
          '(lambda ( x )
               (if (member (setq i (1+ i)) idx)
                   (progn (setq l (append l x)) (if (= m i) l))
                   x
               )
         )
         lst
       )
   )
)
 
_$ (setq lst '((B1 B2)(B3 B4)(B5 B6)))
((B1 B2) (B3 B4) (B5 B6))
_$ (mergesublists '(0 1) lst)
((B1 B2 B3 B4) (B5 B6))
_$ (mergesublists '(0 2) lst)
((B3 B4) (B1 B2 B5 B6))
_$ (mergesublists '(1 2) lst)
((B1 B2) (B3 B4 B5 B6))

handasa 发表于 2022-7-5 16:35:38

工作正常。。。。谢谢李先生
我需要更多的建议来完成我的项目请。。。我不能从包含其他子列表的主列表中删除整个子列表(B1 B2)
'((B1 B2)(B3 B4)(B5 B6))
使用(vl remove(nth 0 lst)lst)对我不起作用。。。有什么建议吗?提前谢谢

Jef! 发表于 2022-7-5 16:42:04

汉达斯,你写的方式是正确的。这将返回没有元素的列表(元素的每一次出现都要小心)。在我的示例中,它如何删除这两个0。
还有一件事:它返回不带元素的列表,但您没有用结果重新定义(setq)lst,这可能是您说它不起作用的原因。

handasa 发表于 2022-7-5 16:49:38

 
你好,杰夫
... 我检查了一下,这次它对我有效。。。可能是我写的代码不正确。。。谢谢jef

Jef! 发表于 2022-7-5 16:54:16

不客气!

Grrr 发表于 2022-7-5 17:02:08

 
李,为什么不使用布尔值呢?
 
顺便说一句,考虑到你发布的这些子功能的数量,你真是令人印象深刻!

Lee Mac 发表于 2022-7-5 17:09:06

 
谢谢你,Grrr-但是你建议在哪里使用布尔值?以什么方式?

Grrr 发表于 2022-7-5 17:17:29

 
因此,结果可能出现在最低/最高索引处,具体取决于它-即:
 

_$ (setq lst '((B1 B2)(B3 B4)(B5 B6)))
((B1 B2) (B3 B4) (B5 B6))

_$ (mergesublists '(0 2) lst nil)
((B3 B4) (B1 B2 B5 B6))

_$ (mergesublists '(0 2) lst T)
((B1 B2 B5 B6) (B3 B4))

 
但经过重新思考,用户可能会为“idx”参数提供如下列表:'(0 5 8 9)
所以我的建议可能不太好。
页: [1]
查看完整版本: 合并主控形状的两个子列表