回溯(最近一次调用最后一次):文件&#34;无&#34;,第18行,<module> IndexError:列表索引超出范围</module>

时间:2014-04-26 01:19:35

标签: python list sorting

text= open("/Users/amanshah/Desktop/hsn/a.tcp","r")
lines=text.readlines()
a=[]
c=[]
d=[]
e=[]
sum1=0
for line in lines:
    temp=line.split()
    a.append(int(temp[1]))
    c.append(int(temp[5]))
for i in range(0,len(a)):
    if a[i]==a[i+1]:
        sum1=sum1+c[i]
        d[i].append(a[i])
        e[i].append(sum)
    else:
        d[i+1].append(a[i])
        e[i+1].append(sum1)
print d

打印e

显示错误

追踪(最近一次通话):   文件“无”,第18行,in IndexError:列表索引超出范围

2 个答案:

答案 0 :(得分:1)

您要附加到不存在的列表元素:

d[i+1].append(a[i])

这相当于:

d = []
d[1].append('a')

这会给你同样的错误。我不知道你想把什么投入到d和e中,但是你可以追加它们,但不能追加它们不存在的元素。

看起来字典对于这个应用程序来说是更好的选择。

d = {}

if i not in d:
    d[i] = []
d[i].append(a[i])

我对你正在尝试的内容没有完全的了解,但是这将检查以前是否找到了这个项目。如果没有,那么它将创建一个要附加的空列表。然后它会为此附加条目。

答案 1 :(得分:0)

看起来应该重写为:

from collections import defaultdict

INPUT = "/Users/amanshah/Desktop/hsn/a.tcp"

payloads = defaultdict(int)

with open(INPUT) as inf:
    for line in inf:
        values  = line.split()
        port    = int(values[1])
        payload = int(values[5])
        payloads[port] += payload

for port in sorted(payloads):
    print("{}: {}".format(port, payloads[port]))

修改:根据您上面的评论,您似乎正在扫描tcp日志文件并累计每个端口的总转移金额。

所以我创建了一个名为payloads的字典,其中payloads[port]保留了该端口的所有有效负载的总和;另外,我把它设为defaultdict(int),这意味着如果我要求payloads[port_I_havent_seen_yet]它会自动创建并返回一个新的条目== 0而不是抛出一个KeyError。

然后我浏览文件的每一行,在我去的时候更新payloads

最后,sorted(payloads)获取payloads个键的列表(我遇到的所有端口)并按升序对其进行排序;然后我打印出每个端口及其总有效负载。根据您的示例数据,您应该看到

1: 156
2: 97
4: 124
5: 241

希望这有帮助!