2013-04-11 92 views
0

我有一組文件,我想在其中提取特殊名稱並計算每個文件中的名稱。我希望我的最終結果是兩個字典象下面這樣:如何在具有計數能力的另一個字典中創建字典?

{ID1:{sam:1,maj:5, tif:7, paul:1},ID2={maj=4,bib=5},..} 

我寫了下面的代碼:

val={} 
for m in result:  
    f= open(path+m[1]+'.txt', 'r') 
    for line in f: 
     search_str= "my_name" 
     if line.startswith(search_str):    
      linename = line.split(' ',2)[1].strip() 
      key= get_name_part(linename)      
      val[key] = val.get(key, 0) + 1 

    maindict[m[0]]=val 

其中m [0]是「FILEID」(重點爲我大辭典)和m [1] =是必須打開的文件。

運行代碼時,我的內心字典永遠是相同的,但只有外部字典的differs.like這個鍵:

{ID1:{sam:1,maj:5, tif:7, paul:1},ID2={sam:1,maj:5, tif:7, paul:1},..} 

任何人有任何想法,我該如何解決?

回答

3

你永遠不會創建一個新的val字典,你只是不斷更新你創建一個循環之前。爲每個ID一個新問題:

maindict = {} 
for m in result: 
    val = maindict.setdefault(m[0], {}) 
    f= open(path+m[1]+'.txt', 'r') 
    for line in f: 
     search_str= "my_name" 
     if line.startswith(search_str):    
      linename = line.split(' ',2)[1].strip() 
      key= get_name_part(linename)      
      val[key] = val.get(key, 0) + 1 

您可以通過使用collections.Countercollections.defaultdict簡化代碼:

from collections import Counter, defaultdict 
import os 

maindict = defaultdict(Counter) 

for m in result: 
    counts = maindict[m[0]] 
    with open(os.path.join(path, m[1] + '.txt'), 'r') as f: 
     search_str = "my_name" 
     counts.update(get_name_part(line.split(None, 2)[1]) 
      for line in f if line.startswith(search_str)) 
+0

謝謝我的問題就解決了。出於某種原因,我忘了提到這一點。 – UserYmY 2013-04-11 14:04:25

相關問題