Lightweight Language Ring : キミならどう書く 2.0 – ROUND 3 –
今回のお題はグラフです.
いくつかのデータを与えたときにグラフを出力するプログラムを作ってください.細かい仕様はありません.
大したことは出来ないが、練習がてら「あるフォルダ内にあるサイズの大きいファイル」を幾つか出力するプログラムを作ってみる。
—–
以下のfilegraph.pyは、第一引数に指定したフォルダの下にある(サブフォルダも含む)ファイルのサイズを調べ、大きい順に第二引数に指定された個数表示する。その際に一番大きいサイズを*マーク50個として、相対グラフを出す。
filegraph.py
import os, sys, time filedict = {} limitNum = 0 def showSortedData(desc=True): global filedict list = [] for key in filedict.keys(): if len(list) < 1: list.append(key) else: for item in list: if filedict[key] > filedict[item]: list.insert(list.index(item), key) break else: list.append(key) if not desc: list.reverse() maxValue = max(filedict.values()) print '' for item in list: print item, str(filedict[item]) + ' bytes' num = (filedict[item] * 50) / maxValue print '*' * num print '' def getFileSize(filename): return os.stat(filename).st_size def deleteMinValue(minsize): global filedict for key in filedict.keys(): if filedict[key] <= minsize: del filedict[key] break def isBestTen(filesize): global filedict, limitNum if len(filedict) >= limitNum: minsize = min(filedict.values()) if filesize > minsize: deleteMinValue(minsize) return True else: return False else: return True def addToDict(arg, dirname, names): global filedict for name in names: filepath = dirname + os.sep + name size = getFileSize(filepath) if isBestTen(size): filedict[filepath] = size if __name__ == '__main__': st = time.time() try: limitNum = int(sys.argv[2]) except: limitNum = 5 if os.path.isdir(sys.argv[1]): os.path.walk(sys.argv[1], addToDict, '') else: os.path.walk(os.getcwd(), addToDict, '') showSortedData() et = time.time() print et - st
実行結果。
C:\Python24>python.exe filegraph.py C:\Python24 6 C:\python24\Doc\Python24.chm 3768458 bytes ************************************************** C:\python24\python24.dll 1867776 bytes ************************ C:\python24\DLLs\tk84.dll 1031168 bytes ************* C:\python24\DLLs\_bsddb.pyd 692224 bytes ********* C:\python24\libs\libpython24.a 660400 bytes ******** C:\python24\DLLs\tcl84.dll 568320 bytes ******* 1.02200007439
見た目、速度ともにアルゴリズムが悪いせいでダメです。改善の余地大いにあり、というかもっと簡単にやる方法がいくらでもありそう。