2012-07-23 20 views
1

我有配對的條目列表的文件(密鑰)是這樣的:定義值列表的字典鍵使用外部文件

6416 2318 
84665 88 
90 2339 
2624 5371 
6118 6774 

而且我已經得到了與另一個文件值到這些按鍵:

266743 Q8IUM7 
64343 H7BXU6 
64343 Q9H6S1 
64343 C9JB40 
23301 Q8NDI1 
23301 A8K930 

正如你可以看到相同的密鑰可以有多個值。我想要做的是創建一個字典,通過自動創建初始k,v對,然後爲已經在字典中的每個條目附加更多值,如下所示:

程序找到"266743: 'Q8IUM7'",然後"64343: 'H7BXU6'"。當它發現"64343: 'Q9H6S1'"它這樣做:"64343: ['H7BXU6', 'Q9H6S1']"

這是我到目前爲止有:

# Create dictionary 
    data = {} 

    for line in inmap: 
     value = [] 
     k, v = [x.strip() for x in line.split('\t')] 
     data[k] = value.append(v) 
     if k in data.viewkeys() == True and v in data.viewvalues() == False: 
      data[k] = value.append(v) 

但如果聲明似乎沒有工作。或者在for循環中有value = []。有什麼想法嗎?

回答

3

這不是一個好主意。您應該從頭開始使用列表,並在列表中擴展該列表,而不是在找到該鍵的多個值時從「字符串」更改爲「字符串列表」。

對於這一點,你可以簡單地使用

from collections import defaultdict 
data = defaultdict(list) 
for line in inmap: 
    k, v = (x.strip() for x in line.split('\t')) 
    data[k].append(v) 

這工作,因爲list類型的defaultdict會自動對空列表作爲它的價值共創的關鍵,當你試圖引用一個不關鍵還存在。否則,它的行爲就像一個普通的字典。

結果:

>>> data 
defaultdict(<type 'list'>, {'23301': ['Q8NDI1', 'A8K930'], 
'64343': ['H7BXU6', 'Q9H6S1', 'C9JB40'], '266743': ['Q8IUM7']}) 
+0

Wooah,就這麼簡單!猜猜我只是讓自己變得很難。像魅力一樣工作,非常感謝! – 2012-07-23 11:13:24

+0

是的,是不是很棒? – 2012-07-23 11:13:45