"组"一个列表由"键"?

时间:2017-01-28 07:20:56

标签: elisp

我想映射一个" flat"结构如:

'(("Jimmy Carter" 10 1 1924)
  ("Donald Trump" 6 14 1946)
  ("George W. Bush" 7 6 1946)
  ("Bill Clinton" 8 19 1946)
  ("Barack Obama" 8 4 1961))

为:

'((1924
   (10
    (1
     ("Jimmy Carter"))))
  (1946
   (6
    (14
     ("Donald Trump")))
   (7
    (6
     ("George W. Bush")))
   (8
    (19
     ("Bill Clinton"))))
  (1961
   (8
    (4
     ("Barack Obama")))))

我。即按照一些"键"列出一个列表,在这个例子中出生年份,月份和日期。对于一般情况,最好的方法是什么?对于只有一个"键"的简单情况,是否有另一种解决方案?每个元素(例如,'democrat'republican)?

1 个答案:

答案 0 :(得分:0)

我建议您使用hash-tables

(let ((ht (make-hash-table))
      (ret ())
  (dolist (record my-data)
    (push record (gethash (my-key record) ht ())))
  (maphash (lambda (key records)
             (push (list key (transform record)) ret))
           ht)
  ret)

这里

  • my-data是您的原始列表
  • my-key提取分组键(例如,年份)
  • transform将展示位置(name a b c)映射到您希望在返回值中看到的层次结构。