2016-11-01 7 views
0

Ich schrieb ein Programm, um diese Frage zu beantworten. Es besagt, dass mein Programm keine Ausgabe hat.Warum hat mein Programm keine Ausgabe?

Frage: Schreiben Sie ein Programm, um die mbox-short.txt zu lesen und die Verteilung nach Stunde des Tages für jede der Nachrichten herauszufinden. Sie können die Stunde aus der 'Von'-Zeile herausziehen, indem Sie die Zeit finden und dann die Zeichenfolge ein zweites Mal mit einem Doppelpunkt aufteilen.

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

Sobald Sie die Zählungen für jede Stunde angesammelt haben, drucken Sie die Zählwerte, sortiert nach Stunden, wie unten gezeigt.

gewünschte Ausgabe:

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

Mein Code:

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

Sind Sie sicher, dass Ihr Code korrekt in diese Seite eingefügt wurde? dann wird der Code nach 'words = line.splite()' nie ausgeführt, da er den gleichen Einzug mit 'continue' hat. – ymonad

+0

Zuerst muss ich prüfen, ob eine Zeile mit 'Von' beginnt. Wenn nicht, macht der continue den Code immer wieder neu, bis er eine Zeile findet, die mit 'From' beginnt. Dann führt es den folgenden Code aus. –

Antwort

0

Ich denke, Sie machen den Fehler, indem Sie die folgenden Codes in die, wenn indentedStatementBlock setzen.

words = line.split() 

    time = words[5] 

    timesplit = time.split(':') 

    hour = timesplit[0] 

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

Sie haben ein Einrückungsproblem. Nichts weiter als weiter in Ihrer Schleife wird jemals verarbeitet werden. Ich würde empfehlen, dass Sie die if-Anweisung zu if line.startswith('From'): ändern und den Fortfahren insgesamt entfernen.

Warum machst du das for x in hour:? hour scheint eine zweistellige Zeichenfolge zu sein. Wenn Sie also über '08' iterieren, wird x gleich '0' und dann '8'. Zählen Sie einfach die Stunde.

Außerdem erstellt counts.items() eine Liste von Tupeln, so dass Sie nicht über diese Liste iterieren müssen, um eine neue Liste von Tupeln zu erstellen.

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

Darüber hinaus sollten Sie es sich zur Gewohnheit machen, die Datei erneut zu schließen.

Edit: Der Vollständigkeit halber ist dies, wie ich das gleiche Problem nähern würde:

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

Durch Versuch und Irrtum und ein wenig Hilfe von den Vorschlägen aus den vorangegangenen Antworten hier, ich bin gekommen, sich mit Die Lösung und mein Code funktionierten!

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 
Verwandte Themen