我需要帮助构建一个函数,该函数将接受一个项目列表,例如'(2 1 3)
并按连续顺序返回每个项目的出现次数。此特定列表将返回'(0 0 0)
。我想在一个循环中这样做。
到目前为止,我的想法是创建一个列表,其中包含要计算的每个项目的位置。我做到了。所以现在我有一个如下所示的列表:STATEMACHINE_ARN_NAME:
Fn::GetAtt: ["preMobilizatonStateMachine", "Name"]
我需要更改此列表以反映我收到的列表中每个元素的计数。我不知道我会怎么做。有什么建议吗?
答案 0 :(得分:1)
考虑以下功能:
(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)
答案 1 :(得分:0)
试试这个:
(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) )