Hello, I need help finishing up an unzip function which takes a zipped list and returns a list of two lists. The result I want is as follows. . .

(unzip '((a b)(1 2)))
  ((a 1)(b 2))
(unzip '((a 1)(b 2)(c 3)))
  ((a b c)(1 2 3))
(unzip '(unzip '()))
  (() ())

I can get my code to work for the null case and with a list containing two lists, but I'm haveing a hard time figuring out how to make it recursive and work for more than 2 lists such as the second example.

(define (unzip l)
  (if (null? l) '(() ())
    (map list (car l)(car(cdr l)))))

This will work fine for an empty list or two lists, but I'm still new to shcheme and have a hard time setting up the recursive part to work with three or possibly more lists.

3 Years
Discussion Span
Last Post by sepp2k

Let's think about what the result should look like for a non-empty list. You want a list that contains two lists, right? So the basic structure should be (list something something-else). Now what do we want something and something-else to be? something should be a list that contains the first element of every sublist in l and something-else should be the list that contains the second element of every sublist. You can define both of these just by using the functions you used in your code: map, car and cdr. But instead of using list as the function for map, you should call map twice -- once with car as the function and once with a combination of car and cdr as the function -- and then wrap the two calls to map in list.

This article has been dead for over six months. Start a new discussion instead.
Please be thoughtful and detailed and be sure to adhere to our posting rules.