3つ以上の集合の直積を求めるプログラム

を最初はRubyで書き始めたのだが、想像してたよりも面倒なことになりそうだった(mapとかinjectでできる?再帰が必要?)。
そんなとき、研究室の先輩にPythonを勧められたときに教えてもらった、リストの内包表記のことをふと思い出したわけである。
自分はPython使いではないので手間取るかと思ったが、かなりあっさりできてしまった。
せっかくだから(?)、最近リリースしたばかりらしいPython 3.0で動くように書き直してみた。

from functools import reduce

# 直積を求める関数
def product(lists):
    return reduce(
        lambda prod, list: [x + [y] for x in prod for y in list],
        lists, [[]])

alphabets = ['A', 'B', 'C']
numbers = [1, 2, 3, 4]
fruits = ["apple", "orange"]

for element in product([alphabets, numbers, fruits]):
    print(element)

printに括弧がいるようになったのはニュースで見て覚えていたが、reduceを使うのにimportが必要なのは知らんかった。
とにかくPythonだとやたらとあっさり書けた。
りすとの ないほうひょうき おいしいです > | ^o^  |

追記

http://d.hatena.ne.jp/Sixeight/20081212/1229100055
Python 3.0なんかで書き直してしまったために、人のマシンを固めてしまうという罪なことをしてしまったw
ということで実際に作ったPython 2.5で動くやつを。

# 直積を求める関数
def product(lists):
    return reduce(
        lambda prod, list: [x + [y] for x in prod for y in list],
        lists, [[]])

alphabets = ['A', 'B', 'C']
numbers = [1, 2, 3, 4]
fruits = ["apple", "orange"]

for element in product([alphabets, numbers, fruits]):
    print element

ほとんど変わらないけどねw