查找出现次数最多的列表和 return 以出现次数最多的元素开头的列表
Find the most occurrences of a list and return a list starting with the most occurrent ele
(defun occurrences (l)
(let (
(result (mapcar #'(lambda (elt) (cons elt (count elt l)) )
(remove-duplicates l) ) )
(result2 nil)
(result3 nil)
(result4 nil)
)
(progn
(sort result #'> :key #'cdr)
(loop for x in result
do (and(push (car x) result2)(push (cdr x) result3))
)
)))
这应该 return 一个按升序排列的排序列表。除了重复最少次数的元素(与列表的其余部分一致)不应 returned。除非所有元素重复相同次数,否则只有在这种情况下,所有元素才会 returned.
例如,
( occurrences '(1 2 3)) => (1 2 3), #notice 每个元素重复相同的次数。
( occurrences '(1 1 3)) => (1) #since there 1 occurs more frequency than any other element in the list.
3 ( 出现次数 '(1 2 3 4 6 6 6 6)) => (6)
- ( 出现次数 '(1 1 3 3 0)) => (1, 3)。 #since (1 2), (3 2) 和 (0 1)
因为元素 1 和 3 的出现次数仍然高于该列表中至少一个元素的出现次数。
注意:现在这个函数 return 是一个排序列表,但不正确的是 return 最大值(出现次数)加上出现的元素至少不大于另一个列表中的元素。
前任。
(occurrences '(7 7 7 1 2 3)) returns (7 1 2 3) 但应该只有 return 7。我真的很感激能帮我把这个功能改成 return什么预期。
使用您的初始方法的解决方案如下:
(defun max-occurrences(l)
(let* ((occurrences (remove-duplicates
(mapcar #'(lambda (elt) (cons elt (count elt l))) l)
:test 'equal))
(max-occurrence (reduce #'max occurrences :initial-value 0 :key #'cdr)))
(mapcar #'car (remove-if-not (lambda(x) (= x max-occurrence)) occurrences :key #'cdr))))
然而,这个解决方案效率不高,因为它的成本为 O(n2)(在初始阶段,列表的每个元素都与所有元素进行比较其他人来计算它的频率)。
已编辑
可以通过使用哈希 table 获得更有效的解决方案(@uselpa 在评论中建议改进):
(defun max-occurrences(l)
(let* ((table (make-hash-table))
(max-count (loop for elt in l maximize (incf (gethash elt table 0)))))
(loop for elt being the hash-key of table using (hash-value count)
when (= count max-count) collect elt)))
(defun occurrences (l)
(let (
(result (mapcar #'(lambda (elt) (cons elt (count elt l)) )
(remove-duplicates l) ) )
(result2 nil)
(result3 nil)
(result4 nil)
)
(progn
(sort result #'> :key #'cdr)
(loop for x in result
do (and(push (car x) result2)(push (cdr x) result3))
)
)))
这应该 return 一个按升序排列的排序列表。除了重复最少次数的元素(与列表的其余部分一致)不应 returned。除非所有元素重复相同次数,否则只有在这种情况下,所有元素才会 returned.
例如,
( occurrences '(1 2 3)) => (1 2 3), #notice 每个元素重复相同的次数。
( occurrences '(1 1 3)) => (1) #since there 1 occurs more frequency than any other element in the list.
3 ( 出现次数 '(1 2 3 4 6 6 6 6)) => (6)
- ( 出现次数 '(1 1 3 3 0)) => (1, 3)。 #since (1 2), (3 2) 和 (0 1) 因为元素 1 和 3 的出现次数仍然高于该列表中至少一个元素的出现次数。
注意:现在这个函数 return 是一个排序列表,但不正确的是 return 最大值(出现次数)加上出现的元素至少不大于另一个列表中的元素。 前任。 (occurrences '(7 7 7 1 2 3)) returns (7 1 2 3) 但应该只有 return 7。我真的很感激能帮我把这个功能改成 return什么预期。
使用您的初始方法的解决方案如下:
(defun max-occurrences(l)
(let* ((occurrences (remove-duplicates
(mapcar #'(lambda (elt) (cons elt (count elt l))) l)
:test 'equal))
(max-occurrence (reduce #'max occurrences :initial-value 0 :key #'cdr)))
(mapcar #'car (remove-if-not (lambda(x) (= x max-occurrence)) occurrences :key #'cdr))))
然而,这个解决方案效率不高,因为它的成本为 O(n2)(在初始阶段,列表的每个元素都与所有元素进行比较其他人来计算它的频率)。
已编辑
可以通过使用哈希 table 获得更有效的解决方案(@uselpa 在评论中建议改进):
(defun max-occurrences(l)
(let* ((table (make-hash-table))
(max-count (loop for elt in l maximize (incf (gethash elt table 0)))))
(loop for elt being the hash-key of table using (hash-value count)
when (= count max-count) collect elt)))