我写了一个回答这个问题的程序。它说我的程序没有输出。
问题: 编写一个程序来读取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
答案 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