如何计算lisp中列表中每个元素的重复次数?

时间:2013-09-28 05:34:04

标签: count lisp

我想计算lisp中列表中每个元素的重复次数。 例如(1 2 1 1 3)应该输出“元素1:三次” 任何解决方案???

2 个答案:

答案 0 :(得分:1)

这应该有效:

;Create a set from an initial input list
(defun set-from-list (lst)
    (let ((st))
        (loop for ele in lst
            do
            (if (not (member ele st))
                (push ele st))) st))

;Now iterate over the set as derived from the list, and count the occurrences, and accordingly, output the result
(defun count-in-list (lst)
    (let ((st (set-from-list lst)))
        (loop for item in st
            do
            (format t "~A occurs ~A times in list ~A ~%" item (count item lst) lst))) nil) 

唯一缺少的是将数字转换为相关的字符串表示形式。但这是相当微不足道的,是你可以为自己做的事情。

答案 1 :(得分:1)

尽管使用count函数单独计算所有不同的元素,但效率极低,因为它具有二次复杂度,但线性复杂度足以解决此任务。

您需要做的是创建一些数据结构映射键到值。 (属性列表(如果只有很少的不同元素)或散列表适用于一般元素。如果元素都是小例子,就像你的例子一样,数组将是一个可行的选择。)元素将是键,它们的频率值。然后,您将迭代列表,并在发生时增加每个值的频率计数。 (只需使用0作为属性列表访问器函数getf或哈希表访问器函数gethash的可选默认参数,并且可以增加不必担心你之前是否看过那个元素。如果使用数组,只需将其所有元素初始化为0。)