Lisp 检查子列表中具有值的关键字的出现情况

Lisp 检查子列表中具有值的关键字的出现情况,lisp,common-lisp,plist,Lisp,Common Lisp,Plist,我有一个数据结构,由列表中的属性列表组成,它们本身就在一个列表中。本质上是一个二维层叠矩阵。其形式如下: (((:VALUE 0 :GROUP 0) (:VALUE 0 :GROUP 0)) ((:VALUE 0 :GROUP 0) (:VALUE 0 :GROUP 0)) ((:VALUE 0 :GROUP 0) (:VALUE 0 :GROUP 0))) 每个:value和:group将包含一个任意整数值。我需要确定:组关键字是否为0。我一直试图通过成员函数实现这一点,但它只会返回ni

我有一个数据结构,由列表中的属性列表组成,它们本身就在一个列表中。本质上是一个二维层叠矩阵。其形式如下:

(((:VALUE 0 :GROUP 0) (:VALUE 0 :GROUP 0))
 ((:VALUE 0 :GROUP 0) (:VALUE 0 :GROUP 0))
 ((:VALUE 0 :GROUP 0) (:VALUE 0 :GROUP 0)))
每个:value和:group将包含一个任意整数值。我需要确定:组关键字是否为0。我一直试图通过
成员
函数实现这一点,但它只会返回
nil

假设数据结构称为
data
,我的代码是:

(member '(:group 0) data :test 'equal))
如何使用
成员
功能检查子列表的子列表中是否出现
:组0
?(如果确实有可能,或者我应该使用几个循环来迭代?

尝试 这个 对于 和/或:

一级嵌套 准备数据 A:找到第7组的第一个事件: B:查找第7组的所有事件: 二级嵌套 准备数据: C:找到第7组的第一个事件: D:查找第7组的所有事件: 定义功能: 根据需要,您可能需要定义函数

(defun get-group (plist)
  (getf plist :group))
(defun find-group (list-of-plists group)
  (find group list-of-plists :key #'get-group))
(defun make-group-finder (group)
  (lambda (list-of-plists) (find-group list-of-plists group)))
现在,您可以将它们用于上述任务:

A:
(查找组*data-1*7)

B:
(删除7*data-1*:key#'get-group:test not#'eql)

C:
(查找if(将组查找器设为7)*data-2*)

D:
(如果没有,则删除(使组查找器7)*data-2*)

PS是“filter”的Lisp习惯用法。

不幸的是
(find 7 data:key(lambda(pl)(getf pl:group))
仍然返回
nil
。我测试了
(getf data:group)
,结果返回
nil
。请允许我指出,您生成的数据结构与我的不完全相同,因为它只是一个plist列表,而不是一个plist列表。
(find 7 *data-1* :key (lambda (pl) (getf pl :group)))
==> (:VALUE 2 :GROUP 7)
(remove 7 *data-1* :key (lambda (pl) (getf pl :group)) :test-not #'eql)
==> ((:VALUE 2 :GROUP 7) (:VALUE 4 :GROUP 7) (:VALUE 8 :GROUP 7))
(defparameter *data-2*
  (loop repeat 10 collect
      (loop repeat (random 4) collect
          (list :value (random 10) :group (random 10)))))
*data-2*
(((:VALUE 9 :GROUP 9) (:VALUE 8 :GROUP 2) (:VALUE 6 :GROUP 7)) NIL
 ((:VALUE 9 :GROUP 5)) ((:VALUE 9 :GROUP 1)) NIL
 ((:VALUE 2 :GROUP 7) (:VALUE 6 :GROUP 5) (:VALUE 2 :GROUP 1))
 ((:VALUE 1 :GROUP 4) (:VALUE 5 :GROUP 5))
 ((:VALUE 9 :GROUP 7) (:VALUE 9 :GROUP 8) (:VALUE 7 :GROUP 4))
 ((:VALUE 4 :GROUP 7)) NIL)
(find-if (lambda (l)
           (find 7 l :key (lambda (pl) (getf pl :group))))
         *data-2*)
==> ((:VALUE 9 :GROUP 9) (:VALUE 8 :GROUP 2) (:VALUE 6 :GROUP 7))
(remove-if-not (lambda (l)
                 (find 7 l :key (lambda (pl) (getf pl :group))))
               *data-2*)
==>
(((:VALUE 9 :GROUP 9) (:VALUE 8 :GROUP 2) (:VALUE 6 :GROUP 7))
 ((:VALUE 2 :GROUP 7) (:VALUE 6 :GROUP 5) (:VALUE 2 :GROUP 1))
 ((:VALUE 9 :GROUP 7) (:VALUE 9 :GROUP 8) (:VALUE 7 :GROUP 4))
 ((:VALUE 4 :GROUP 7)))
(defun get-group (plist)
  (getf plist :group))
(defun find-group (list-of-plists group)
  (find group list-of-plists :key #'get-group))
(defun make-group-finder (group)
  (lambda (list-of-plists) (find-group list-of-plists group)))