【问题标题】:Check if item is in a list (Lisp)检查项目是否在列表中(Lisp)
【发布时间】:2011-09-02 22:03:46
【问题描述】:

检查项目是否在列表中的简单方法是什么?

类似

(in item list)

如果item=1list=(5 9 1 2)false 如果item=7 可能返回true

【问题讨论】:

    标签: list lisp common-lisp


    【解决方案1】:

    普通 Lisp

    FIND 不是个好主意:

    > (find nil '(nil nil))
    NIL
    

    以上意味着NIL不在(NIL NIL)列表中——这是错误的。

    FIND 的目的不是检查成员资格,而是找到满足测试的元素(在上面的示例中,测试函数是通常默认的EQL)。 FIND 返回这样一个元素。

    使用MEMBER

    > (member nil '(nil nil))
    (NIL NIL)  ; everything non-NIL is true
    

    POSITION:

    > (numberp (position nil '()))
    NIL
    

    【讨论】:

      【解决方案2】:

      使用MEMBER 测试一个项目是否在列表中:

      (member 1 '(5 9 1 2))  ; (1 2)
      

      FIND不同,它还可以测试NIL是否在列表中。

      【讨论】:

      • 我不太喜欢这个建议。 member 从找到元素的位置返回列表。该问题要求诸如谓词之类的东西,返回TNIL。因此,我建议这个答案应该包含在 if 中,并且所有定义为阅读此页面的任何人都在寻找的功能:(defun contains (item sequence) (if (member item sequence) T NIL))
      【解决方案3】:

      你可以使用find:

      (find 1 '(5 9 1 2)) ; 1
      (find 7 '(5 9 1 2)) ; nil
      

      考虑使用:test 参数:

      (find "a" '("a" "b") :test #'equal)
      

      【讨论】:

      • (find nil '(nil nil)) -> nil
      猜你喜欢
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2021-06-25
      • 2012-06-30
      • 2021-09-14
      相关资源
      最近更新 更多