2016-11-01 17 views
0

私はこの質問に答えるプログラムを書いた。私のプログラムには出力がないと言われています。私のプログラムに出力がないのはなぜですか?

質問: mbox-short.txtを読み、各メッセージの1時間ごとの配信を調べるプログラムを作成します。 'From'行から時間を見つけ、コロンを使用して文字列をもう一度分割することで、時間を引き出すことができます。

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 

マイコード:

name = raw_input("Enter file:") 
if len(name) < 1 : name = "mbox-short.txt" 
handle = open(name) 

counts = dict() 

for line in handle: 
    if not line.startswith('From'): 
     continue 

     words = line.split() 

     time = words[5] 

     timesplit = time.split(':') 

     hour = timesplit[0] 

     for x in hour: 
      counts[x] = counts.get(x, 0) + 1 

lists = list() 

for key, val in counts.items(): 
    lists.append((key, val)) 
    lists.sort(reverse=True) 

for val, key in lists: 
    print key, val 
+1

コードがこのページに正しく貼り付けられていることを確認してください。 'words = line.splite()'の後のコードは、 'continue'と同じ字下げをしているので実行されません。 – ymonad

+0

最初に行が 'From'で始まるかどうかを確認する必要があります。そうでなければ、 'From'で始まる行が見つかるまで、continueはコードを繰り返し実行します。次に、次のコードを実行します。 –

答えて

0

私はあなたがもしindentedStatementBlockに以下のコードを入れて間違いを犯すと思います。

words = line.split() 

    time = words[5] 

    timesplit = time.split(':') 

    hour = timesplit[0] 

    for x in hour: 
     counts[x] = counts.get(x, 0) + 1 
0

インデントの問題があります。何もないcontinueあなたのループ内で処理されます。 if文をif line.startswith('From'):に変更し、続行をすべて削除することをお勧めします。

なぜあなたはこれをやっていますfor x in hour:?時間は2文字列のように見えるので、 '08'を反復するとき、xは '0'、次に '8'に等しくなります。ちょうど時間を数えてください。

また、counts.items()はタプルのリストを作成するので、そのリストを繰り返してタプルの新しいリストを作成する必要はありません。

lists = counts.items() 
lists.sort(reverse=True) 

さらに、ファイルを閉じるのを習慣にする必要があります。

編集:試行錯誤と、ここで前回の回答からの提案からビット助けを通じ

from collections import Counter 

def extract_hour(line): 

    return line.split()[5].split(':')[0] 

lists = Counter(extract_hour(line) for line in open("mbox-short.txt") if line.startswith('From')).items() 
0

は、私が出ている:完全性期すため が、これは私が同じ問題にアプローチする方法をありますソリューションと私のコードが機能しました!

name = raw_input("Enter file:") 
if len(name) < 1 : name = "mbox-short.txt" 
handle = open(name) 

counts = dict() 

for line in handle: 
    line = line.rstrip() 
    if line == '': continue 
    if line.startswith('From '): 
     words = line.split() 
     time = words[5] 
     tsplit = time.split(":") 
     counts[tsplit[0]] = counts.get(tsplit[0], 0) + 1 


lists = list() 

for key, val in counts.items(): 
    lists.append((key, val)) 

lists.sort() 

for val, key in lists: 
    print val, key 
関連する問題