hi, I need to write a function (join_similar expr) where expr is
adata structure with the following format ( (x1 y1) (x2 y2) (x3 y3)...
(xn yn)),
join_similar will return an expression like ( (x1 y1 y2) (x3 y3) ...)
when x1=x2
for instance:
*(join_similar '((3 4) (7 5) (3 6) (7 8) (3 9) (0 1))
would return:
((3 4 6 9) (7 5 8) (0 1))
Lieven Marchand wrote:
CL-USER 9 > (defun join-similar (list)
(loop with ht = (make-hash-table)
for (first second) in list
do
(pushnew second (gethash first ht nil))
finally (return (loop for first being each hash-key in ht using (hash-value rest) collect (cons first rest)))))
JOIN-SIMILAR
Isn't LOOP beautiful? <g,d&r>
<g> No...
(defun join-similar (pairs &aux result)
(dolist (pair pairs (nreverse result))
(nconc (or (assoc (first pair) result)
(first (push (list (first pair)) result)))
(list (second pair)))))
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 298 |
Nodes: | 16 (2 / 14) |
Uptime: | 24:08:24 |
Calls: | 6,678 |
Calls today: | 1 |
Files: | 12,222 |
Messages: | 5,341,919 |
Posted today: | 1 |