2017-01-22 11 views
-8

mbox-short.txtを読み、各メッセージの時間帯別分布を把握するプログラムを作成します。 'From'行から時間を見つけ、コロンを使用して文字列をもう一度分割することで、時間を引き出すことができます。インデックス1の値に基づいて昇順にタプルのリストを並べ替えます。

From [email protected] Sat Jan 5 09:14:16 2008 

各時間のカウントを集計したら、以下に示すように、カウントを時間単位で印刷します。 予想される出力:

04 3 
06 1 
07 1 
09 2 
10 3 
11 6 
14 1 
15 2 
16 4 
17 2 
18 1 
19 1 

コード:

fname = raw_input('Enter file name: ') 


fhand = open(fname) 

c = dict() 

for line in fhand: 

    if not line.startswith('From ') : continue 

    pieces = line.split() 

    time = pieces[5] 

    parts = time.split(':') 

    hour = parts[0] 
    c[hour] = c.get(hour,0) + 1 

lst = list() 
for key in c: 
    value = c[key] 
    lst.append((value, key)) 

lst.sort() 

for value, key in lst: 
    print key, value 

私は

06 1 ← Mismatch 
07 1 
14 1 
18 1 
19 1 
09 2 
15 2 
17 2 
04 3 
10 3 
16 4 
11 6 
+2

をあなたの質問のタイトルが巨大に向上させることができました。タイトルだけでは、この質問が他の誰にも将来役立たないことは明らかです。 – byxor

+2

ようこそスタックオーバーフロー!宿題の助けを求めているようです。それ自体に問題はありませんが、これらのことを守ってください(http://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions/338845#338845)、それに応じて質問を編集してください。 –

答えて

0

lstを得た出力が持つタプルのリストです各タプルは値を(値、キー)の形式で保持します。そして、タプルのインデックス1にあるキーに基づいてソートするとします。その場合、あなたはとキーで.sort()を呼び出すする必要があります。

from operator import itemgetter 

lst.sort(key=itemgetter(1)) 

OR、あなたはまた、キーとしてラムダ式を使用することがあります。

lst.sort(key=lambda x: x[1]) 

また、あなたがする必要はありませんソートされたコンテンツを印刷するために別のリストを作成します。ソートされたdictオブジェクトを反復するには、sorted(c.items())を使用します。したがって、あなたが行うことがあります。

for key, value in sorted(c.items()): 
    print key, value 

の代わり:

lst = list() 
for key in c: 
    value = c[key] 
    lst.append((value, key)) 

lst.sort() 

for value, key in lst: 
    print key, value 
+0

タプルは、デフォルトで最初の要素で最初にソートされるので、キーのないソートと同じ動作になります(同じ最初の要素を持つ項目は元の順序を保持します)。 '0'の代わりに' 1'要素を意味しましたか? – TigerhawkT3

+0

@ TigerhawkT3それを指摘していただきありがとうございます。 OPタプルが '(value、key)'のペアとして逆ペアを持っているのを見逃しました –

関連する問題