gpt4 book ai didi

lisp - 在更新其中一个列表的同时遍历两个列表

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:59 25 4
gpt4 key购买 nike

我有两个列表如下:

(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) , 但它可以扩展。

关于lisp - 在更新其中一个列表的同时遍历两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17659586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com