0

特別な名前を抽出し、各ファイルの名前を数えたい一連のファイルがあります。最終結果を以下のような2つの辞書にしたい:

{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]= は開く必要があるファイルです。

コードを実行すると、内側の辞書は常に同じですが、外側の辞書のキーのみが異なります。次のように:

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

どうすれば修正できますか?

4

1 に答える 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.Counterと を使用してコードを簡素化できますcollections.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))
于 2013-04-11T13:47:01.190 に答える