为什么我的程序没有输出?

时间:2016-11-01 02:20:12

标签: python data-structures

我写了一个回答这个问题的程序。它说我的程序没有输出。

问题: 编写一个程序来读取mbox-short.txt并找出每天消息的按小时分布。你可以从' From'通过找到时间,然后使用冒号第二次拆分字符串。

From sample.user@example.com.za 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

3 个答案:

答案 0 :(得分:0)

我猜您将以下代码放入if indentedStatementBlock中会犯错误。

    words = line.split()

    time = words[5]

    timesplit = time.split(':')

    hour  = timesplit[0]

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

答案 1 :(得分:0)

你有缩进问题。除了 继续 之外,您的循环中的任何内容都将被处理。我建议您将if语句更改为if line.startswith('From'):并完全删除继续。

你为什么这样做for x in hour:?小时似乎是一个两个字符的字符串,所以当你迭代'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()

答案 2 :(得分: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