2016-11-15 47 views
1

我想更改我的代码的输出。我有这样的代码:更改我的代码输出 - Python

from collections import defaultdict 

third = defaultdict(lambda: (defaultdict(lambda : defaultdict(int)))) 

count = 0 

fh = open("C:/Users/mycomp/desktop/data.txt", "r").readlines() 

for line in fh: 
    line_split = line.split(); 

    date = line_split[0]; 
    time = line_split[1]; 
    ip = line_split[2]; 

    third [date][time][ip]+= 1 

for date, d in third.iteritems(): 
    for time , count in d.iteritems(): 
     print "%s %s %s %s" % (date, time, count,ip) 

日志文件是这样的:

2016-11-04 00:00:12 10.11.13.13 
2016-11-05 00:00:15 10.14.12.11 
2016-11-06 00:00:19 10.10.15.13 

我的输出类似下面。

2016-10-04 07:46 defaultdict(<type 'int'>, {'10.11.13.15': 574}) 10.11.13.15 
2016-10-04 15:58 defaultdict(<type 'int'>, {'10.21.24.13': 364}) 10.21.24.13 
2016-10-04 15:59 defaultdict(<type 'int'>, {'10.21.22.13': 359}) 10.21.22.13 
2016-10-04 07:42 defaultdict(<type 'int'>, {'10.21.27.10': 287}) 10.21.27.10 
2016-10-04 07:43 defaultdict(<type 'int'>, {'10.11.37.13': 337}) 10.11.37.13 

,但我想的输出是这样的:

2016-10-04 07:46 {'10.11.13.15': 574}) 10.11.13.15 
2016-10-04 15:58 {'10.21.24.13': 364}) 10.21.24.13 
2016-10-04 15:59 {'10.21.22.13': 359}) 10.21.22.13 
2016-10-04 07:42 {'10.21.27.10': 287}) 10.21.27.10 
2016-10-04 07:43 {'10.11.37.13': 337}) 10.11.37.13 
+0

打印“%s%s%s%s”%(date,dict(time),count,ip)试试这一行。 –

回答

1

你的字典里有三个层次,所以每个值有你需要得到它的三个键(日期,时间和IP)。你的输出代码在前两个循环中循环,但是没有遍历IP的循环,所以你得到一个字典。

我怀疑你想这样的事情,有三个循环:

for date, x in third.iteritems(): 
    for time, y in x.iteritems(): 
     for ip, count in y.itertiems(): 
      print "%s %s %s %s" % (date, time, count, ip) 

如果你真的想从一个单一的日期和时间,所有的数据在一行(即使有多个要打印所涉及的知识产权),我想你可以改变你的陈述,以便看起来更好。您在当前代码中获得的count值是从IP地址映射到计数的最内层的defaultdict之一。您可以在转换为常规dict如果你想和它包含在您电话print

for date, d in third.iteritems(): 
    for time, ip_count in d.iteritems(): 
     print "%s %s %s" % (date, time, dict(ip_count)) 

注意,只有三个被格式化的东西(IP和计数是同一对象的一部分)。您的代码中的ip参数实际上并没有正常工作,因为它没有在您的两个级别的循环中设置。实际上,您打印出填入字典时使用的最后一个IP地址(因此输入文件的最后一行是那个IP地址)。与您的示例输出不同,我怀疑它与您打印的内部字典的内容不匹配。

请注意,上述两个版本的代码都会以大多数任意顺序打印您的数据。同一天的所有行将一起打印(并且在一天内同时打印所有行),但在这些分组之外,值将以任意顺序排列。您可能需要使用sorted把你的数据在一个有用的顺序:

import operator 
keyfunc = operator.itemgetter(0) 

for date, x in sorted(third.iteritems(), key=keyfunc): 
    for time, y in sorted(x.iteritems(), key=keyfunc): 
     for ip, count in sorted(y.itertiems(), key=keyfunc): 
      print "%s %s %s %s" % (date, time, count, ip) 

我也想如用date, time, ip元组键的字典考虑使用较少的嵌套的数据结构。