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