gpt4 book ai didi

python - 更改我的代码输出 - Python

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:49 25 4
gpt4 key购买 nike

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

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

最佳答案

您的字典有三个级别,因此每个值都有您需要访问的三个键(日期、时间和 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)

如果您确实希望将单个日期和时间的所有数据打印在一行上(即使涉及多个 IP),我想您可以更改您的 print 声明,这样看起来更好。您在当前代码中获取的 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)

我还会考虑使用嵌套较少的数据结构,例如以日期、时间、ip 元组为键的字典。

关于python - 更改我的代码输出 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40602383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com