Python 哈希键长度变化导致列表索引超出范围错误

Python 哈希键长度变化导致列表索引超出范围错误,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我有一个文本文件。该文件的每行有6个字段或7个字段 如果一行中有7个字段,我将前6个字段作为键,第7个字段作为该键的值 如果一行中有6个字段,我将前5个字段作为键,第6个字段作为该键的值 我不知道发布整个代码是否必要,但为了清晰起见,我正在发布整个代码 我的代码粘贴在下面: ReqResRS = {} with contextlib.nested(open(sys.argv[1],'r'), open(sys.argv[2], 'w')) as (inpf, outf): lines

我有一个文本文件。该文件的每行有6个字段或7个字段

  • 如果一行中有7个字段,我将前6个字段作为键,第7个字段作为该键的值

  • 如果一行中有6个字段,我将前5个字段作为键,第6个字段作为该键的值

我不知道发布整个代码是否必要,但为了清晰起见,我正在发布整个代码

我的代码粘贴在下面:

ReqResRS = {}
with contextlib.nested(open(sys.argv[1],'r'), open(sys.argv[2], 'w')) as (inpf, outf):
    lines = [l.split() for l in inpf if l.strip()]
    for l in lines:
            if(l[6]):
                    myKey = (l[0],l[1],l[2],l[3],l[4],l[5])
                    myValue = l[6]
                    if(myKey in ReqResRS):
                            diff = float(l[6])-float(ReqResRS[myKey]);
                            if(float(diff) < 0.000008):
                                    ReqResRS[myKey] = myValue
                            else:
                                    ReqResRS[myKey] = myValue
                                    outf.write(l[0] + "\t" + l[1] + "\t" + l[2] + "\t" + l[3] + "\t" + l[4] + "\t" + l[5] + "\t" + l[6] + "\n")
                    else:
                            ReqResRS[myKey] = myValue
                            outf.write(l[0] + "\t" + l[1] + "\t" + l[2] + "\t" + l[3] + "\t" + l[4] + "\t" + l[5] + "\t" + l[6] + "\n")
            else:
                    myKey = (l[0],l[1],l[2],l[3],l[4])
                    myValue = l[5]
                    if(myKey in ReqResRS):
                            diff = float(l[5])-float(ReqResRS[myKey]);
                            if(float(diff) < 0.000008):
                                    ReqResRS[myKey] = myValue
                            else:
                                    ReqResRS[myKey] = myValue
                                    outf.write(l[0] + "\t" + l[1] + "\t" + l[2] + "\t" + l[3] + "\t" + l[4] + "\t" + l[5] + "\n")
                    else:
                            ReqResRS[myKey] = myValue
                            outf.write(l[0] + "\t" + l[1] + "\t" + l[2] + "\t" + l[3] + "\t" + l[4] + "\t" + l[5] + "\n")
ReqResRS={}
将contextlib.nested(open(sys.argv[1],'r')、open(sys.argv[2],'w'))设置为(inpf,outp):
lines=[l.split(),如果l.strip(),则inpf中的l为l]
对于l in行:
如果(l[6]):
myKey=(l[0],l[1],l[2],l[3],l[4],l[5])
myValue=l[6]
如果(我的输入请求):
diff=浮动(l[6])-浮动(要求[myKey]);
如果(浮动(差值)<0.000008):
需求[myKey]=myValue
其他:
需求[myKey]=myValue
输出写入(l[0]+“\t”+l[1]+“\t”+l[2]+“\t”+l[3]+“\t”+l[4]+“\t”+l[5]+“\t”+l[6]+“\n”)
其他:
需求[myKey]=myValue
输出写入(l[0]+“\t”+l[1]+“\t”+l[2]+“\t”+l[3]+“\t”+l[4]+“\t”+l[5]+“\t”+l[6]+“\n”)
其他:
myKey=(l[0],l[1],l[2],l[3],l[4])
myValue=l[5]
如果(我的输入请求):
diff=浮动(l[5])-浮动(要求[myKey]);
如果(浮动(差值)<0.000008):
需求[myKey]=myValue
其他:
需求[myKey]=myValue
输出写入(l[0]+“\t”+l[1]+“\t”+l[2]+“\t”+l[3]+“\t”+l[4]+“\t”+l[5]+“\n”)
其他:
需求[myKey]=myValue
输出写入(l[0]+“\t”+l[1]+“\t”+l[2]+“\t”+l[3]+“\t”+l[4]+“\t”+l[5]+“\n”)
如果阵列太短,则失败。 访问不属于数组的值总是会导致异常。因此,您应该事先检查阵列是否足够长,如下所示:

if len(l) == 7:
如果阵列太短,则失败。 访问不属于数组的值总是会导致异常。因此,您应该事先检查阵列是否足够长,如下所示:

if len(l) == 7:

我想你想把
如果l[6]
改为
如果len(l)==7

但是这类事情应该比你现在做的更容易(从上面的代码中,你需要根据你的数据文件有多少列来对事情进行特殊处理):


我想你想把
如果l[6]
改为
如果len(l)==7

但是这类事情应该比你现在做的更容易(从上面的代码中,你需要根据你的数据文件有多少列来对事情进行特殊处理):

我猜
if(l[6]):
应该是
if(len(l)==7):
在第5行

请注意,您还可以编写以下内容

try:
    myKey = (l[0], l[1], l[2], l[3], l[4], l[5])
    myValue = l[6]
except IndexError:
    myKey = (l[0], l[1], l[2], l[3], l[4])
    myValue = l[5]

if(myKey in ReqResRS):
    diff = float(myValue) - float(ReqResRS[myKey]);
    if(float(diff) < 0.000008):
            ReqResRS[myKey] = myValue
    else:
            ReqResRS[myKey] = myValue
            outf.write('{}\t{}\n'.format("\t".join(myKey), myValue)
else:
    ReqResRS[myKey] = myValue
    outf.write('{}\t{}\n'.format("\t".join(myKey), myValue)
试试看:
myKey=(l[0],l[1],l[2],l[3],l[4],l[5])
myValue=l[6]
除索引器外:
myKey=(l[0],l[1],l[2],l[3],l[4])
myValue=l[5]
如果(我的输入请求):
diff=浮动(myValue)-浮动(要求[myKey]);
如果(浮动(差值)<0.000008):
需求[myKey]=myValue
其他:
需求[myKey]=myValue
write(“{}\t{}\n.”格式(“\t”.join(myKey),myValue)
其他:
需求[myKey]=myValue
write(“{}\t{}\n.”格式(“\t”.join(myKey),myValue)
我猜
if(l[6]):
应该是
if(len(l)==7):
在第5行

请注意,您还可以编写以下内容

try:
    myKey = (l[0], l[1], l[2], l[3], l[4], l[5])
    myValue = l[6]
except IndexError:
    myKey = (l[0], l[1], l[2], l[3], l[4])
    myValue = l[5]

if(myKey in ReqResRS):
    diff = float(myValue) - float(ReqResRS[myKey]);
    if(float(diff) < 0.000008):
            ReqResRS[myKey] = myValue
    else:
            ReqResRS[myKey] = myValue
            outf.write('{}\t{}\n'.format("\t".join(myKey), myValue)
else:
    ReqResRS[myKey] = myValue
    outf.write('{}\t{}\n'.format("\t".join(myKey), myValue)
试试看:
myKey=(l[0],l[1],l[2],l[3],l[4],l[5])
myValue=l[6]
除索引器外:
myKey=(l[0],l[1],l[2],l[3],l[4])
myValue=l[5]
如果(我的输入请求):
diff=浮动(myValue)-浮动(要求[myKey]);
如果(浮动(差值)<0.000008):
需求[myKey]=myValue
其他:
需求[myKey]=myValue
write(“{}\t{}\n.”格式(“\t”.join(myKey),myValue)
其他:
需求[myKey]=myValue
write(“{}\t{}\n.”格式(“\t”.join(myKey),myValue)

请提及帖子中的任何错误,以便我可以修改。请提及帖子中的任何错误,以便我可以修改。我认为应该是len(l)==7,而不是len(l)==6@JustinCarrey--已修复,但感谢您帮助我在这里保持良好声誉:-)。甚至比我的建议更好!我认为它应该是len(l)==7,而不是len(l) ==6@JustinCarrey--已修复,但感谢您帮助我在这里保持良好声誉:-)。甚至比我的建议更好!我认为应该是len(l)==7,而不是len(l)==6感谢您的注意。修复了此问题,并尝试重构一点代码,因为您的if/else分支中有很多相似之处(try/except可能不是这里最好的解决方案,但无论如何,你看到了这个想法)我认为应该是len(l)==7,而不是len(l)==6感谢你的注意。修复了这个问题,并尝试重构一点代码,因为你在if/else分支中有很多相似之处(try/except可能不是这里最好的解决方案,但无论如何,你看到了这个想法)