我有两个列表如下:
(x y z) & (2 1)
我想要这样的结果:
((x y) (z))
列表的关系很清楚。所以基本上我想将第一个列表的成员重新排列成一个列表列表,其中包含两个(第二个列表的长度)列表。我尝试运行两次 dotimes 迭代来执行此操作:
(let ((result) (list1* list1))
(dotimes (n (length list2) result)
(progn (setq result
(append result
(list (let ((result2))
(dotimes (m (nth n list2) result2)
(setq result2
(append result2
(list (nth m list1*)))))))))
(setq list1*
(subseq list1* 0 (nth n list2))))))
我的想法是,我制作预期结果 (x y) 的第一个列表,然后我想更新 (x y z) 列表,以便删除 x 和 y,我只有 (z)。然后循环再次运行以获取预期结果中的 (z) 列表。这不能正常工作并导致:
((x y) (x))
这显然意味着用于更新 list1* 的 progn 的第二个命令不起作用。显然,必须有一种正确且更好的方法来执行此操作,我想知道是否有人可以提供帮助。还要解释为什么不能解释解决方案?
如果我没看错,你的问题出在 (subseq list1* 0 (nth n list2))
中,它返回列表中你没有的部分想要。
我可以提供以下内容:
(defun partition-list (list lengths)
(mapcar (lambda (length)
(loop :repeat length
:collect (pop list)))
lengths))
当然,这有点简单,因为它不处理意外输入,例如 (length list)
小于 (reduce #'+ lengths)
, 但它可以扩展。
我是一名优秀的程序员,十分优秀!