0

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

到目前为止,我的想法是创建一个列表,其中包含要计算的每个项目的位置。我已经做到了。所以现在我有一个看起来像这样的列表:'(0 0 0)我需要更改这个列表以反映我收到的列表中每个元素的计数。我不知道我会怎么做。有什么建议么?

4

2 回答 2

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)
于 2018-01-02T15:54:23.003 回答
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) )
于 2017-10-31T11:57:41.933 回答