list - 具有隐式顺序 lisp 的平面无序列表和元组

标签 list data-structures lisp common-lisp

Lisp 中是否有一个函数的工作方式与 assoc 与关联列表的工作方式相同,但适用于扁平的有序列表和一组具有隐式排序的元组?例如,我有一个扁平的无序列表和一个查找函数:

(defparameter *data2* '((alf age 55 year 2 course lisp)
                        (sue age 22 year 3 course java)
                        (ralf age 16 year 1 course lisp)
                        (alf age 8 year 2 course lisp)))

(defun lookup (name course data)
  (cdr (assoc name (cdr (assoc course data)))))

当被调用时,lookup 函数就像:

(lookup 'alf 'course *data*) ==> get lisp

现在,使用“具有隐式顺序的元组”(即,值始终以相同顺序排列的值列表):

(defparameter *data3* '((alf 55 lisp 2)
                        (sue 22 java 3)
                        (ralf 16 lisp 1)
                        (alf 8 lisp 2)))

对于关联列表,是否有任何函数的工作方式与 assoc 相同,但对于平面无序列表和具有隐式顺序的元组?

最佳答案

不确定我是否完全理解你;是这样的吗?

(defun lookup (name attr data)
  (mapcar (lambda (x) (cadr (member attr x)))
          (remove-if-not (lambda (x) (eq name (car x))) data)))

然后

? (lookup 'alf 'course *data2*)
(LISP LISP)
? (lookup 'alf 'age *data2*)
(55 8)
?(lookup 'ralf 'year *data2*) 
(1)

对于你的另一个例子:

(defun lookup (name attr data)
  (mapcar (lambda (x) (nth attr x))
          (remove-if-not (lambda (x) (eq name (car x))) data)))

然后

(lookup 'alf 2 *data3*)
(lookup 'alf 1 *data3*)
(lookup 'ralf 3 *data3*)

关于list - 具有隐式顺序 lisp 的平面无序列表和元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20101191/

相关文章:

list - Haskell - 为什么为列表实现替代方案

algorithm - 最被低估或鲜为人知但有用的算法是什么?

lisp - 设置,不在 Lisp 世界中列出?

lisp - Scriptfu 没有以正确的顺序执行,为什么?

python - 如何检查字典中的键是否出现两次或两次以上?

r - 列表的索引列表

Java - 使列表大小动态化

C++ 就地转换 vector 类型

algorithm - 创建整数数据结构并查找给定整数位于哪个组件

emacs - 如何使用带有 emacs cedet 的鼠标选择文件?