Python-将复杂文件读入字典

Python-将复杂文件读入字典,python,file-io,dictionary,Python,File Io,Dictionary,我的输入文件是: -150 150 -90 130 1 -150 150 -150 170 1 -150 150 -110 140 1 -150 160 -80 -20 1 -150 170 -140 160 1 -150 170 -70 -40 1 -140 -170 -110 150 1 -14

我的输入文件是:

-150     150    -90      130    1
-150     150    -150     170    1
-150     150    -110     140    1
-150     160    -80     -20     1
-150     170    -140     160    1
-150     170    -70     -40     1
-140    -170    -110     150    1
-140     130    -120     110    1
-140     140     160    -150    1
-140     160    -150     150    1
我需要创建一个python字典,以便键是前两列,值是另一个字典,其中键是3+4列,值是第5列:

'-140 160' : {'-150 150' : 0.0188679245283019},
'-140 -170' : {'-110 150' : 0.0188679245283019},
'-150 170' : {'-140 160' : 0.0188679245283019, '-70 -40' : 0.0188679245283019},
'-150 160' : {'-80 -20' : 0.0188679245283019},
'-150 150' : {'-150 170' : 0.0188679245283019, '-110 140' : 0.0188679245283019}
到目前为止,我一直在使用一个perl脚本将其转换为类似于上面所示的文本,然后将该文本复制粘贴到我的python代码中。(这个值变成了一个分数,因为我把它除以56的总和

from collections import defaultdict

bigdict = defaultdict(dict)
for ln in file:
    a,b,c,d,e = ln.split()
    bigdict[(a,b)][(c,d)] = e
如果需要字符串键,请将
(a,b)
替换为
“%s%s%”(a,b)
,类似地,对于
(c,d)
,这应该可以:

f = open('file')
dictionary = {}
for line in f:
    a, b, c, d, e = line.split()
    try:
        dictionary['%s %s' % (a, b)]['%s %s' % (c, d)] = e
    except KeyError:
        dictionary['%s %s' % (a, b)] = dict([('%s %s' % (c, d), e)])

可能想用“%s%s”(a,b)替换(a,b),同样地,用(c,d)替换(a,b)来匹配OP。这非常有效。这比使用
bigdict={}
然后使用
如果(a,b)不在bigdict中,那么后面跟着
快吗:bigdict[(a,b)]={}
如果您的数据非常庞大,可能会产生影响,请分析这两个选项并选择最快的。这只是最短、最具Python风格的解决方案。仅供参考,您可以使用元组作为字典键。这通常是可取的。在这种情况下,您可以保留前两列的单个数字,并且仍然使用它们作为键(在元组中)。这不会覆盖以前的dict(a,b)重复情况吗?