鱼C论坛

 找回密码
 立即注册
查看: 2150|回复: 4

从文档里提取时间点并统计

[复制链接]
发表于 2016-2-19 17:03:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖栗子泥 于 2016-2-19 18:43 编辑

有一个文档 里面都是邮件信息,我想要统计在同一个时间段内(同一个小时范围内,比如都是6点或者8点或者18点)发的邮件的数量
代码如下
fhand = open('mbox-short.txt')
counts = dict()

for line in fhand:
    line = line.rstrip()
    if not line.startswith('From ') : continue
    words = line.split()
    time = words[5]
    times= time.split(":")
    hours = times[0]


   
    for number in hours:
        counts[number] = counts.get(number, 0 ) + 1

lst = list()
for key, val in counts.items():
    lst.append( (val, key) )
lst.sort(reverse=True)
for val, key in lst[:] :
    print (key, val)         
提取出hours 是这样的
09
18
16
15
15
14
11
11
11
11
11
11
10
10
10
09
07
06
04
04
04
19
17
17
16
16
16
然而最后统计的时候,是酱紫的
('1', 26)
('0', 10)
('6', 5)
('4', 4)
('9', 3)
('7', 3)
('5', 2)
('8', 1)
我想要的这样的(下面)。。
04 3
06 1
07 1
09 2
10 3
11 6
14 1
15 2
16 4
17 2
18 1
19 1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-2-19 18:05:52 | 显示全部楼层
本帖最后由 小小大鱼 于 2016-2-19 18:08 编辑

没看懂你的描述,不知道是哪一条没满足你的要求,是‘没排序’还是‘不要弄成元组的形式’?
下面是一些发现
1.hours事实上是只有一个元素的列表,用for number in hours意义在哪没看出来
2.下面是我按你的hours选取前面的几个元素运行结果:
  1. counts ={}
  2. hours=['09','18','16','15','15','14']

  3. for number  in hours:
  4.     counts[number] = counts.get(number,0)+1

  5. print(counts)

  6. lst = list()
  7. for key,val in counts.items():
  8.     lst.append((val,key))
  9. lst.sort(reverse=True)
  10. for val,key in lst[:]:
  11.     print(key,val)
复制代码

输出:
  1. {'16': 1, '18': 1, '14': 1, '09': 1, '15': 2}
  2. 15 2
  3. 18 1
  4. 16 1
  5. 14 1
  6. 09 1
复制代码


3.如果是第二条没满足,那么,你得检查下你的hours,与我上面的hours=['09','18','16','15','15','14']差异在哪?
4.如果是因为没排序,那么你试试在lst.sort(key,reverse =True)用key设定你的排序方式。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-2-20 12:21:26 | 显示全部楼层
小小大鱼 发表于 2016-2-19 18:05
没看懂你的描述,不知道是哪一条没满足你的要求,是‘没排序’还是‘不要弄成元组的形式’?
下面是一些发 ...

之前说的确实很不明白,因为比较仓促。 我想问的是为什么hours 中的时间值比如12 后来被分成“1”和“2”两个值来count了。 根据你的意见我把程序修改了
代码如下
  1. fhand = open('mbox-short.txt')
  2. counts = dict()

  3. for line in fhand:
  4.     line = line.rstrip()
  5.     if not line.startswith('From ') : continue
  6.     words = line.split()
  7.     time = words[5]
  8.     times= time.split(":")
  9.    
  10.     lis1= [times[0]]

  11.     for hour in lis1:
  12.         counts[hour] = counts.get(hour, 0 ) + 1
  13.         lis1 = list ()

  14. lst = list()
  15. for key, val in counts.items():
  16.     lst.append( (val, key) )


  17. lst.sort()
  18. for val, key in lst[:] :
  19.     print (key, val)
复制代码

然后输出的结果是
06 1
07 1
14 1
18 1
19 1
09 2
15 2
17 2
04 3
10 3
16 4
11 6
是按照VALUE 的值的大小排序的
怎样修改可以变成用KEY的大小来排序?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-20 14:13:31 | 显示全部楼层
糖栗子泥 发表于 2016-2-20 12:21
之前说的确实很不明白,因为比较仓促。 我想问的是为什么hours 中的时间值比如12 后来被分成“1”和“2” ...

1.hours并没有被拆分,你的输出结果中我没发现哪里被拆分了啊
2.按key排序的实现:
  1. lst.sort(key=lambda x:int(x[1]))
复制代码

lst.sort()中的key可以自定义函数:这里的匿名函数:int(x)中x为你上面的元组,x[1]取后面的,即value
输出结果如下:
  1. 09 1
  2. 14 1
  3. 15 2
  4. 16 1
  5. 18 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-22 16:36:26 | 显示全部楼层
小小大鱼 发表于 2016-2-20 14:13
1.hours并没有被拆分,你的输出结果中我没发现哪里被拆分了啊
2.按key排序的实现:

最最最开始 是酱紫的输出
('1', 26)
('0', 10)
('6', 5)
('4', 4)
('9', 3)
('7', 3)
('5', 2)
('8', 1)
所以我觉得是被拆分了。。。 谢谢你的回答,问题解决啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-19 18:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表