我需要帮助构建一个函数,该函数将接受项目列表,例如并按'(3 3 3 1 1 2)
连续顺序返回每个项目的出现。这个特定的列表将返回'(2 1 3)
。我想在一个循环中做到这一点。
到目前为止,我的想法是创建一个列表,其中包含要计算的每个项目的位置。我已经做到了。所以现在我有一个看起来像这样的列表:'(0 0 0)
我需要更改这个列表以反映我收到的列表中每个元素的计数。我不知道我会怎么做。有什么建议么?
我需要帮助构建一个函数,该函数将接受项目列表,例如并按'(3 3 3 1 1 2)
连续顺序返回每个项目的出现。这个特定的列表将返回'(2 1 3)
。我想在一个循环中做到这一点。
到目前为止,我的想法是创建一个列表,其中包含要计算的每个项目的位置。我已经做到了。所以现在我有一个看起来像这样的列表:'(0 0 0)
我需要更改这个列表以反映我收到的列表中每个元素的计数。我不知道我会怎么做。有什么建议么?
考虑以下函数:
(defun itemcount ( lst )
(if lst (cons (- (length lst) (length (setq lst (vl-remove (car lst) lst)))) (itemcount lst)))
)
此函数将返回在提供的列表中遇到的每个项目出现次数的列表:
_$ (itemcount '(3 3 3 1 1 2))
(3 2 1)
对于有序结果,只需在评估函数之前对提供的列表进行排序(但要注意vl-sort
删除重复的整数,所以使用vl-sort-i
) 例如:
_$ (setq lst '(3 3 3 1 1 2))
(3 3 3 1 1 2)
_$ (itemcount (mapcar '(lambda ( n ) (nth n lst)) (vl-sort-i lst '<)))
(2 1 3)
尝试这个:
(defun SortByOccurance ( ListOfItems / *error* x item pairs sorted )
(defun *error* ( msg / )
(if (not (null msg ) ) (progn (princ "\nSortByOccurance:*error*: " ) (princ msg ) (princ "\n") ) )
)
(foreach x ListOfItems
(setq item (assoc x pairs ) )
(setq pairs (if (null item )
(append pairs (list (cons x 1 ) ) )
(subst (cons (car item) (1+ (cdr item ) ) ) item pairs)
) )
)
(setq sorted (vl-sort pairs (function (lambda ( x y ) (< (cdr x) (cdr y)))) ) )
(setq sorted (mapcar 'car sorted ) )
sorted
)
( SortByOccurance (list 3 3 3 1 1 2) )