2012-11-28 3 views
1

Я пытаюсь взять список списков списков (не волнуйтесь, я приведу пример) и преобразую элементы по крайней мере в один из них. Это то, что я сделал до сих пор:Как сделать элементы нескольких списков в одном в lisp

(defun cost(state) 
(let ((list_elements '())) 
(dolist (element state) 
    (dolist (subElement element) 
    (setq list_elements (append list_elements (list subElement)))) 
finally (return list_elements)))) 

Пример:

(list 
(list 
    (list 
     (list 1 9 't121) 
     (list 1 10 't122)) 
    (list 
     (list 2 10 't123) 
     (list 2 11 't124))) 
(list 
    (list 
     (list 1 9 't121) 
     (list 1 11 't132)) 
    (list 
     (list 2 11 't133) 
     (list 2 12 't134)))) 

Итак, это, как предполагается вернуть ((1 9 T121) (1 10 T122) (2 10 T123) (2 11 T124) (1 9 T121) (1 11 T132) (1 11 T132) (2 11 T133) (2 12 T134)) И это возвращает только ((1 9 T121) (1 11 T132))

После этого, Я должен считать количество различных элементов в списке.

Кто-нибудь видит проблему в этой функции?

ответ

1
(defun double-append (list) 
    (reduce #'append (reduce #'append list))) 

;; or like this: 
(defun mapcan-mapcon (list) 
    (mapcan #'append (mapcon #'car list))) 

(double-append (list 
(list 
    (list 
    (list 1 9 't121) 
    (list 1 10 't122)) 
    (list 
    (list 2 10 't123) 
    (list 2 11 't124))) 
(list 
    (list 
    (list 1 9 't121) 
    (list 1 11 't132)) 
    (list 
    (list 2 11 't133) 
    (list 2 12 't134))))) 

((1 9 T121) (1 10 T122) (2 10 T123) (2 11 T124) (1 9 T121) (1 11 T132) 
(2 11 T133) (2 12 T134)) 

До сих пор я мог сказать по ожидаемому результату, что должно быть что-то вроде этого.

;; Using Alexandria, just as an example, of how currying can save 
;; some repetitive coding: 
(ql:quickload "alexandria") 
(defun curried-append() 
    (let ((reducer (alexandria:curry #'reduce #'append))) 
    (alexandria:compose reducer reducer))) 

(funcall 
(curried-append) 
(list 
    (list 
    (list 
    (list 1 9 't121) 
    (list 1 10 't122)) 
    (list 
    (list 2 10 't123) 
    (list 2 11 't124))) 
    (list 
    (list 
    (list 1 9 't121) 
    (list 1 11 't132)) 
    (list 
    (list 2 11 't133) 
    (list 2 12 't134))))) 
+0

Это почти что. Эти функции возвращают это: '(1 9 T121 1 11 T132 2 11 T133 2 12 T134 3 11 T111 3 10 T001)' но это нормально, нашел решение – FriedRike

+0

Знаете ли вы, как я могу найти количество разных элементов в список? – FriedRike

+1

Я спросил у Google, и впервые в жизни он не знал ответа (или не хотел его показывать) – FriedRike

Смежные вопросы