从列表列表中提取项目?

时间:2016-03-24 02:43:52

标签: lisp common-lisp

我正在为课程做一个与lisp相关的作业,其中一个问题要求我们使用square从列表中“提取”一个项目(这是否意味着他希望我们打印它,或者只是删除它,我不完全知道,我假设他希望我们打印它。)

我通常理解使用类似mapcar的内容来获取列表中的第三项,但使用(nth 3 (list 1 2 3 4))会使这看起来过于复杂 - 特别是当他希望我们测试的数据是(他想要我们)时提取社会保障号码):

mapcar

有人可以使用((olsen jimmy 123-76-4535 cub-reporter) (kent clark 089-52-6787 reporter) (lane lois 951-26-1438 reporter) (white perry 355-16-7439 editor)) 指导我如何做到这一点吗?我一直在查找网页链接,似乎mapcar通常用于对列表中的每个项目执行特定操作,而不是单个项目。 (或者我可能错误地理解了这个问题?)

2 个答案:

答案 0 :(得分:1)

我确实设法解决了 - 它非常简单,你真正需要的只是在项目列表上做“第三”。我得到的代码是:

(setf daily-planet
    '((olsen jimmy 123-76-4535 cub-reporter)
      (kent clark 089-52-6787 reporter)
      (lane lois 951-26-1438 reporter)
      (white perry 355-16-7439 editor)))

(mapcar #'third daily-planet)

它有效!

答案 1 :(得分:1)

CL-USER 26 > (setf daily-planet
                   '((olsen jimmy 123-76-4535 cub-reporter)
                     (kent clark 089-52-6787 reporter)
                     (lane lois 951-26-1438 reporter)
                     (white perry 355-16-7439 editor)))

((OLSEN JIMMY |123-76-4535| CUB-REPORTER) (KENT CLARK |089-52-6787| REPORTER)
 (LANE LOIS |951-26-1438| REPORTER) (WHITE PERRY |355-16-7439| EDITOR))

您的解决方案:

CL-USER 27 > (mapcar #'third daily-planet)

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|)

探索替代方案

只使用lambda函数什么都不做。它只返回每个项目:

CL-USER 28 > (mapcar #'(lambda (x)
                         x)
                     daily-planet)

((OLSEN JIMMY |123-76-4535| CUB-REPORTER) (KENT CLARK |089-52-6787| REPORTER)
 (LANE LOIS |951-26-1438| REPORTER) (WHITE PERRY |355-16-7439| EDITOR))

现在使用third访问每个子列表的第三个元素:

CL-USER 29 > (mapcar #'(lambda (x)
                         (third x))
                     daily-planet)

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|)

现在使用NTH访问每个子列表的第三个元素:

CL-USER 30 > (mapcar #'(lambda (x)
                         (nth 2 x))
                     daily-planet)

(|123-76-4535| |089-52-6787| |951-26-1438| |355-16-7439|)