[Python / LLRing ] re:君ならどう書く2.0 -Round 3-
Python で書いてみる。引数として与えられた数値のうち最大の数値を '*' 20個であらわし、他の数値は '*' をつかった相対的な長さで表現することにしよう。
import sys
# descending sort
# because all argument are recognized as string,
# it is necessary transform str to int. After that,
# using sort( reverse=True ).
num_list = []
for arg in sys.argv[1: ]:
num_list.append( float(arg) )
num_list.sort( reverse = True )
# Maximum is represented by ('*' * 20).
# others are represented by relative length with '*'.
args_and_str = { num_list[0]: '*' * 20 }
for anum in num_list[1: ]:
relative_length = int( round(( anum / num_list[0] ) * 20) )
args_and_str[ anum ] = '*' * relative_length
# display graph
key_list = args_and_str.keys()
key_list.sort(reverse = True)
for akey in key_list:
print "%g : %s" % ( akey, args_and_str[akey] )
本当は太字の部分は
#for akey in args_and_str.keys().sort( reverse = True ):
って一行で片付けたかったんだけど、これでは Iteratable object が返らないみたいだし*1、無理にやろうとすると複雑になりそうな予感がしたので3行に分割することにしました。
読みやすいコードを意識したのですがどうでしょうか?
他の方のコードを見ていると場違いな気がしてきました orz
*1: list.sort() は in place の Stable 置換なので新たなリストオブジェクトは返ってきません。None が返ってきます。
| 固定リンク
この記事へのコメントは終了しました。
コメント