2011-05-02 63 views
3

我的輸入文件是:的Python - 讀一個複雜的文件到字典

-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

+2

僅供參考,您可以使用元組作爲字典鍵,這通常是可取的,在這種情況下,您可以保留前兩列的單個數字,並仍然將它們用作鍵(在一個元組中)。 – Keith 2011-05-02 19:21:49

回答

7
from collections import defaultdict 

bigdict = defaultdict(dict) 
for ln in file: 
    a,b,c,d,e = ln.split() 
    bigdict[(a,b)][(c,d)] = e 

如果你想字符串鍵,與'%s %s' % (a, b)(c,d)更換(a,b),同樣將其劃分

+3

可能想要repl ace(a,b)與「%s%s」(a,b)同樣,(c,d)與OP匹配。 – 2011-05-02 19:12:56

+0

@thouis:好點,補充說,答案。 – 2011-05-02 19:18:35

+0

這很好。這比使用'bigdict = {}'快,後跟'if(a,b)不在bigdict:bigdict [(a,b)] = {}'? – Mikhail 2011-05-02 19:28:55

1

這應該工作:

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)]) 
+0

這不會覆蓋以前的詞典爲重複(a,b)的情況? – Mikhail 2011-05-02 19:23:52