在Autolisp中列出项目计数

时间:2017-10-26 16:19:54

标签: autolisp

我需要帮助构建一个函数,该函数将接受一个项目列表,例如'(2 1 3)并按连续顺序返回每个项目的出现次数。此特定列表将返回'(0 0 0)。我想在一个循环中这样做。

到目前为止,我的想法是创建一个列表,其中包含要计算的每个项目的位置。我做到了。所以现在我有一个如下所示的列表:STATEMACHINE_ARN_NAME: Fn::GetAtt: ["preMobilizatonStateMachine", "Name"] 我需要更改此列表以反映我收到的列表中每个元素的计数。我不知道我会怎么做。有什么建议吗?

2 个答案:

答案 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) )