2017-01-28 111 views
0

我要地图 “扁平化” 的结构,如:按“键”对列表进行“分组”?

'(("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),是否有另一种解决方案?

回答

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)列入您想要在返回值中查看的层级即
相关问题