Deutsch   English   Français   Italiano  
<v7md14$pr7r$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!feeds.phibee-telecom.net!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <Nobody447095@here-nor-there.org>
Newsgroups: comp.lang.lisp
Subject: Accumulating in hash-table
Date: Mon, 22 Jul 2024 19:47:49 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 41
Message-ID: <v7md14$pr7r$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Mon, 22 Jul 2024 21:47:50 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="e396b2dbc7de6c10992283c407241561";
	logging-data="847099"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19mD0KLhPkqsq0VBnpMtqIA"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:PILd6cyRqttNCVAJl89dWQZE13o=
Bytes: 2172

> (defun distribution1 (items values test)
>   (let ((table (make-hash-table :test test)))
>     (loop for item in items
>           for value in values
>           do (incf (gethash item table 0) value))
>     (let ((items-list nil))
>       (maphash (lambda (item sum-value)
>                  (push (cons item sum-value) items-list))
>                table)
>       (sort items-list #'> :key #'cdr))))
> 
> An example call:
> 
> CL-USER 58 > (distribution1 '("a" "b" "c" "b" "a" "f" "e" "g"
>   "h" "k" "z" "k" "r" "u" "f")
>                             '(1 5 8 7 14 8 3 7 9 4 3 21 5 7 9)
>                             #'equal)
> (("k" . 25) ("f" . 17) ("a" . 15) ("b" . 12) ("h" . 9) ("c" . 8)
>  ("g" . 7) ("u" . 7) ("r" . 5) ("e" . 3) ("z" . 3))

Gauche Scheme

(define (distribution1 items values test)
  (let1 table (make-hash-table test)
    (for-each
      (^(item value)
        (hash-table-update! table item (cut  + value <>) 0))
      items
      values)
    (sort (hash-table->alist table) > cdr)))

(distribution1 '("a" "b" "c" "b" "a" "f" "e" "g"
  "h" "k" "z" "k" "r" "u" "f")
  '(1 5 8 7 14 8 3 7 9 4 3 21 5 7 9)
  'equal?)

  ===>
(("k" . 25) ("f" . 17) ("a" . 15) ("b" . 12) ("h" . 9) ("c" . 8) ("g" . 7)
 ("u" . 7) ("r" . 5) ("z" . 3) ("e" . 3))