When it’s ready.

出来るまで出来ない

pythonのmapの使いどころの一つ

LLTV行けなかったよぅ。USTも見つけられなかったし、TVって名前なのに中継してないの残念、まぁ有料だからしょうがないな。報告ブログなどをポチポチ見て回っています。LLTVでどなたが言ったか分からないけど「Mapを使っていきましょう」と言っていたらしい。
pythonでmap関数試した事があるだけで、実際どこにも使った事がなかったので改めてどんなところで使うのか考えてみた。普通にList渡してforしてる所で使えそう。

ファイルの読み込みの所でforが多段で有ったのでそこに使って見た。

読み込みたいファイル

Player.dat

名前 : 所属 : 地域 : 識別子
太郎 : 赤 : 地球 : E
ゆき : 青 : 木星 : J

みたいなデータファイルを読み込む

[
  ['名前', '所属', '地域', '識別子'],
  ['太郎', '赤', '地球', 'E'],
  ['ゆき', '青', '木星', 'J']
]

という風になればOK

ファイルを読む部分のソースは以下のような感じで

import os, logging, codecs
file_path = os.path.dirname(__file__)

def loadFile(file_name):
  DATA_PATH = os.path.join(file_path, file_name)
  try:
    res = codecs.open(DATA_PATH, 'r', 'euc-jp').readlines()
  except Exception, e:
    logging.warning(u'ExceptionType: %s'%(e))
    logging.warning(u'%s : file open fail'%(file_name))
    res = []
  return res

forバージョン

def forSplit(fArr):
  resArr = []
  for line in fArr:
    lineArr = []
    for word in line.split(':'):
      lineArr.append(word.strip())
    resArr.append(lineArr)
  return resArr

ちょっと、丁寧すぎる気がしなくもないがforで書くとこんな感じになる。
スプリットして、ストリップ。パッと思いつくのはこんな感じかも。

map使ったバージョン

def mapSplit(fArr):
  return map(lambda a:map(lambda b:b.strip(),a.split(':')), fArr)

そんなに無理せずに、1行になった。mapの範囲を見れば読見にくいと言うわけでは無い気がする。
だけどコレを一発で思いつくかというと、思いつかないなぁ

LC使ったバージョン

map考えてる時にリスト内包表記で書くのを思いついた。

def lcSplit(fArr):
  return [[word.strip() for word in line.split(':')] for line in fArr]

なにげにコレが一番しっくり来るかも・・・
mapが使うのが目的だったけど、この書き方見つけられたのでまぁいっか。

mapが活躍するところって実際どんなところが多いんだろ。
lambdaとか、可読性下がる気がするし、map関数に渡すところに書き殴るのあんまり好きじゃないなぁと
かといって、外に出すとそっちも見にくい気がするし。慣れの問題かな。