Lisp: How to get all possible combinations of the elements from lists contained on a list?

前端 未结 2 1522
自闭症患者
自闭症患者 2021-01-15 04:20

I need to write a function in Common-Lisp that takes a list of lists and returns a list containing all the possible combinations of the elements from the sublists.

S

相关标签:
2条回答
  • 2021-01-15 04:46

    If you don't want to use a library, here's code to do the same thing, and works with any number of lists:

    (defun combinations (&rest lists)
      (if (endp lists)
          (list nil)
          (mapcan (lambda (inner-val)
                    (mapcar (lambda (outer-val)
                              (cons outer-val
                                    inner-val))
                            (car lists)))
                  (apply #'combinations (cdr lists)))))
    
    [2]> (combinations '(1 2))
    ((1) (2))
    [3]> (combinations '(1 2) '(3 4))
    ((1 3) (2 3) (1 4) (2 4))
    [4]> (combinations '(1 2) '(3 4) '(5 6))
    ((1 3 5) (2 3 5) (1 4 5) (2 4 5) (1 3 6) (2 3 6) (1 4 6) (2 4 6))
    
    0 讨论(0)
  • 2021-01-15 05:07

    wvxvw removed their answer that pointed to a function from Alexandria, but it does provide a very similarly named function that actually does what you want. Instead of alexandria:map-combinations, you need alexandria:map-product, e.g.

    (apply #'alexandria:map-product #'list '((1 2) (1 2)))
    

    evaluates to

    ((1 1) (1 2) (2 1) (2 2))
    
    0 讨论(0)
提交回复
热议问题