filter関数も非常に便利な関数だ。前にやったIPアドレス取得のプログラムを少し改造した関数を作り、IPアドレスをある個数以上持つホスト名を選び出すフィルタを作ってみよう。
以下のような関数countipaddrを作る。返り値はIPアドレスの個数。
import socket def countipaddr(hostname): try: return len(socket.getaddrinfo(hostname,None)) except socket.gaierror: return 0
実行結果。
>>> filter((lambda s:countipaddr(s) >= 3),['www.yahoo.co.jp','www.gogle.com','www.hatena.ne.jp','www.yahoe.co.jp','mixi.jp']) ['www.yahoo.co.jp', 'www.gogle.com', 'mixi.jp'] >>> filter((lambda s:countipaddr(s) >= 3),['www.yahoo.com','www.msn.com','www.cnet.com','www.amazon.com','www.goo.co.jp']) ['www.yahoo.com']
AmazonなんかはIPアドレスたくさん持ってないんですね(調べたら一つだった)。逆にmixiはたくさん持ってるな。
filter関数を使えば、前回やったエラトスセネスの篩のアルゴリズムもより簡素の形になるだろう。今度やってみるか。