2017-01-28 21 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) в иерархию, которую вы хотите увидеть в возвращаемой стоимости е.