我有两个列表如下
清单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) ))
)
答案 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,它是免费的,可以帮助您。