Lisp两个列表,从每个列表中获取项目在一起

时间:2015-03-31 16:03:54

标签: list lisp common-lisp

我有两个列表如下

清单1((第1 5 9项)(第2项50 15)(第3项39 99)(项目4 16 79)(项目5 20 96))

清单2((1 0 1 0 1)(1 1 1 1 1)(1 0 1 0 1))

我希望它像

(第1 5 9条)(1) (项目2 50 15)(0) (项目3 39 99)(1) (项目4 16 79)(0) (项目4 16 79)(1)

为每条染色体做这件事。到目前为止我有以下代码

(defun print-Lists (list1 list2)
(loop for x in list1
      for y in list2
      collect (print(list x y) ))
)

2 个答案:

答案 0 :(得分:1)

我没有完全掌握你的例子,但也许这样的事情会有所帮助吗?

(loop for x in '((1 1 1) (1 0 1))
      append (mapcan (lambda (a b) (list a (list b)))
                     '((item 1 2 3) (item 4 5 6) (item 7 8 9))
                     x))

评估为:

((ITEM 1 2 3) (1) (ITEM 4 5 6) (1) (ITEM 7 8 9) (1) (ITEM 1 2 3) (1)
(ITEM 4 5 6) (0) (ITEM 7 8 9) (1))

翻译成你的例子,这看起来像

(loop for x in list2
      append (mapcan (lambda (a b) (list a (list b)))
                     list1
                     x))

(如果您希望将每个迭代放在一个单独的列表中,请将append更改为collect。)

然后,您只需使用

打印结果列表即可
(format t "~{~A ~A~%~}" result-list)

或类似的东西。

请记住,这仅在list2中的项目长度与list1的长度匹配时才有效。

有关mapcan的更多信息,请访问

http://www.lispworks.com/documentation/HyperSpec/Body/f_mapc_.htm

问候,K。

答案 1 :(得分:1)

你提出的最后3个问题确实说你需要循环地图,减少和更高阶函数。 Lisp有一些很棒的工具,但如果你使用你所知道的东西,你就不会有任何好处。

(defvar a '((item 1 5 9) (item 2 50 15) (item 3 39 99) (item 4 16 79) (item 5 20 96)))
(defvar b '(1 0 1 0 1))

> (mapcan (lambda (x y) (list x (list y))) a b)
((ITEM 1 5 9) (1) (ITEM 2 50 15) (0) (ITEM 3 39 99) (1) (ITEM 4 16 79) (0) (ITEM 5 20 96) (1))

它不是完全你所要求的,但它应该为你指明道路。

我对功能性的东西很认真。查看this book,它是免费的,可以帮助您。