Code Fun: Generate Cartesian Product

By Xah Lee. Date: . Last updated: .
xtodo
tuples 2025-06-14 18868
tuples 2025-06-14 18868

Solution by moe, in python

from itertools import product

lst = [1, 2, 3]
k = 2

tuples = list(product(lst, repeat=k))
print(tuples)
# [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

Solution by steve, in emacs lisp

(defun tuples (list n)
  "Returns all possible n-tuple."
  (if (zerop n) (list nil)
      (mapcan (lambda (elt)
                (mapcar (lambda (sub) (cons elt sub))
                        (tuples list (1- n))))
              list)))

(tuples '() 99)
 ; => NIL

(tuples '(a b c) 0)
 ; => (NIL)

(tuples '(a b c) 1)
 ; => ((A) (B) (C))

(tuples '(a b c) 2)
 ; => ((A A) (A B) (A C) (B A) (B B) (B C) (C A) (C B) (C C))

(tuples '(a b c) 3)
 ; => ((A A A) (A A B) (A A C) (A B A) (A B B) (A B C) (A C A) (A C B) (A C C)
 ; (B A A) (B A B) (B A C) (B B A) (B B B) (B B C) (B C A) (B C B) (B C C)
 ; (C A A) (C A B) (C A C) (C B A) (C B B) (C B C) (C C A) (C C B) (C C C))

(tuples '(a b) 4)
 ; => ((A A A A) (A A A B) (A A B A) (A A B B) (A B A A) (A B A B) (A B B A)
 ; (A B B B) (B A A A) (B A A B) (B A B A) (B A B B) (B B A A) (B B A B)
 ; (B B B A) (B B B B))

;; EDGE CASE: How should we handle it? Should it be NIL or (NIL)?
(tuples '() 0)
 ; => (NIL)