Differences

This shows you the differences between two versions of the page.

py:lesson3_rev [2012/10/25 22:23] (current)
Line 1: Line 1:
 +[[python_curriculum|目次へ]]
 +
 +====== 残業時間ファイナル・指南編 ======
 +
 +{{:py:phage.jpg|}}
 +
 +===== できた人 =====
 +
 +<box 80%>
 +できたよ
 +<code>
 +ruikeibo = {}
 +SHUGYO = 17*60 + 20
 +
 +for my_line in open ("leavetime3.txt"):
 +    my_triplet = my_line[:-1].split(",")
 +    year_month = my_triplet[0][:6]
 +    my_key = year_month + "," + my_triplet[1]
 +    taishaJikoku = my_triplet[2].split(":")
 +    zangyo  = int(taishaJikoku[0])*60 + int(taishaJikoku[1]) - SHUGYO
 +    if zangyo < 0:
 +        zangyo = zangyo + 24*60
 +
 +    ruikeibo.setdefault(my_key, 0)
 +    ruikeibo[ my_key ] += zangyo
 +
 +print ruikeibo
 +
 +
 +saicho = 0
 +for k in ruikeibo.keys():
 +    if saicho < ruikeibo[k]:
 +        longest_person = [k]
 +        saicho = ruikeibo[k]
 +    elif saicho == ruikeibo[k]:
 +        longest_person.append(k)
 +
 +print longest_person, ": ", saicho/60, "hours", saicho%60, "minutes"
 +</code>
 +</box>
 +
 +練習2のあたりで最大値を調べるところまでこなしてくださったおかげで、ここはさらっとやってのけました。ばっちりです。
 +
 +ここのミソは、「だれが何月に」という要素をまとめてキーにしてしまうところですね。あとで辞書を調べて最大値を調べれば、自動的に誰が何月に行った残業だったのかがわかるという仕掛けです。
 +
 +えーと。
 +
 +それ以上言うことがなかったりして。
 +
 +続き的な要素は、別のオマケ記事に書こうと思います。
 +
 +===== べつのかた =====
 +
 +<box 80%>
 +できた、と思う
 +<code>
 +gd={}
 +for s in open("leavetime3.txt"):
 +  a_list=s[:-1].split(",")
 +  date1=a_list[0]
 +  date=date1[0:6]
 +  key=date+a_list[1]
 +  taisha=a_list[2].split(":")
 +  zangyo=(int(taisha[0])*60+int(taisha[1]))-(17*60+20)
 +  if zangyo<0:
 +    zangyo+=(24*60)
 +  gd.setdefault(key,0)
 +  gd[key]+=zangyo
 +
 +kaito=0
 +for i in gd.keys():
 +  if gd[i] >kaito:
 +      kaito=gd[i]
 +      person=key
 +print person, kaito/60, "hours", kaito%60, "minutes"
 +</code>
 +</box>
 +
 +お疲れ様でした。順に見てまいります。
 +
 +a_listは、改行文字(行末の一文字)を取り去ってから「,」で分けました。
 +
 +date変数には、20100723みたいな文字列から頭6文字分、つまり年月部分だけを入れました。
 +
 +辞書のキーは、年月と従業員名を直接くっつけて、これを使うことにしたようですね。これでも用は足りますが、201007Yamamoto みたいな値が出てきて、あとで切れ目が判断しにくいかも知れません。ここは
 +
 +<code>
 +key = date + "," + a_list[1]
 +</code>
 +
 +とでもすると結果が少し見やすくなってよいのではないかと思います。
 +
 +で、zangyo変数には残業時間を計算して、午前サマ対応処理もして、辞書に順々に足しこんでいく、と。ここまではよいです。
 +
 +スクリプトの後半は、最大残業時間を探す処理ですね。
 +
 +kaitoという変数には暫定記録の時間部分、personという変数にはそれに対応する従業員名を入れることにして、処理を書きました。
 +
 +gd.keys()は、辞書のキーをすべて調べるための書き方です。で、現在の暫定記録 kaito を上回る値が出てきたらそれを書き換えていく…
 +
 +ひとつだけ惜しい点がありました。person = key という部分です。keyはこの付近では使っていない変数ですね。これではおかしな値が入ります。キーの一覧をひとつづつ「i」変数に入れながら処理をしているのですから、person = i と書くのが適当だったようです。
 +
 +最大残業時間それ自体は、正しく見つけられるようですよ。誰がいつやったことか、についてのみ表示が違ってしまいました。
 +
 +間違いは惜しいですが、この記事を読んだ人は同じ間違いをしないですむのですから、これはこれで貴重なのです。
 +
 +===== ほかのかた =====
 +
 +ほかにもドーゾ
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki