【问题标题】:Scheme collecting similar items in a list and finding most common item in a list [duplicate]计划在列表中收集类似项目并在列表中查找最常见的项目[重复]
【发布时间】:2013-10-02 00:25:47
【问题描述】:

我想创建一个函数,该函数会在列表中出现多少次元素。例如在列表中:'(a b c b b c c a) 我希望它返回一个嵌套列表: '((a 2) (b 3) (c 3))

我知道这个函数看起来像这样:

(define collect-similar
 (lambda (elm ls)
  (cond
   [(null? ls) '()]
   [(equal? elm (car ls))]

我知道我需要继续检查列表,直到它返回到空列表的基本情况,我可以使用 cadr 检查列表的其余部分。但我不太确定如何获取该值以及如何使其返回嵌套列表。

我正在尝试编写的下一个函数查找列表中最常见的元素。例如,在列表 '(a a a a a b c) 上运行函数将简单地返回 a。我知道我可以利用 collect-similar 功能并找到最高的数字。

【问题讨论】:

  • 这样的函数通常称为直方图。

标签: scheme


【解决方案1】:

这已经被问过了,只需调整@ChrisJester-Young 的bagify 实现之一即可。例如:

(define (collect-similar lst) ; a slightly modified `bagify`
  (hash->list
   (foldl (lambda (key ht)               
            (hash-update ht key add1 0))
          '#hash()
          lst)))

(collect-similar '(a b c b b c c a))
=> '((a . 2) (b . 3) (c . 3))

有了collect-similar,很容易找到最常见的元素:

(define (most-common lst)
  (let loop ((alst (collect-similar lst)) ; use previous procedure
             (maxv '(#f . -inf.0)))
    (cond ((null? alst) (car maxv))
          ((> (cdar alst) (cdr maxv))
           (loop (cdr alst) (car alst)))
          (else
           (loop (cdr alst) maxv)))))

(most-common '(a a a a a b c))
=> 'a

【讨论】:

  • +1 表示欢呼。 ;-D
  • Oscar... 有没有办法在不获取配对的情况下执行类似收集的功能?所以在你的例子中得到 '((a 2) (b 3) (c 3))?
  • 其实没关系,我把它记下来真的很容易。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 2015-04-22
  • 2021-08-31
相关资源
最近更新 更多