2016-07-03 10 views
1

テキストファイルに基づいてネストされた辞書を作成したかったのです。例えば。 (TEXT.TXT)Python 3でネストされた辞書を作成するときの問題

... 
hostA   hostA.testing.com    192.168.1.101 
hostB   hostB.testing.com    192.168.1.102 
... 

理想的には、私は、だから私は、次のPythonコード作られた以下のネストされた辞書

... 
{'hostA': {'FQHN': 'hostA.testing.com', 'IP': '192.168.1.101'}, 'hostB': {'FQHN': 'hostB.testing.com', 'IP': '192.168.1.102'}} 
... 

を取得したい:私の理解を超えて、しかし

myinnerdict={} 
myouterdict={} 

def main(): 
    my_fh = open('text.txt', 'r') 
    for line in my_fh: 
     newline = line.strip().split() # get ride of the '\n' and make it a inner list . 
     #print(newline) 
     myinnerdict['FQHN']=newline[1] 
     myinnerdict['IP']=newline[2] 
     #print(myinnerdict) 
     #print(newline[0]) 
     myouterdict[newline[0]]=myinnerdict 
    print(myouterdict) 

if __name__ == "__main__": 
    main() 
... 

を、私はそれを実行したときに私はこの結果を得た:

... 
{'hostA': {'FQHN': 'hostB.testing.com', 'IP': '192.168.1.102'}, 'hostB': {'FQHN': 'hostB.testing.com', 'IP': '192.168.1.102'}} 
... 

私が欲したものではないが、私が逃したものは分からない。親切に助けてください。

答えて

0

問題は、同じ変数を辞書に再利用していることです。したがって、myouterdictは実際のデータではなく変数myinnerdictへの参照を格納しているため、両者は同じです。たとえば、これを試してください:あなたが見ることができるように、baの参照ではなくaの空の辞書データを記憶している

>>> a = {} 
>>> b = {"my a variable": a} 
>>> b 
{'my a variable': {}} 
>>> a["asdf"] = 3 
>>> b 
{'my a variable': {'asdf': 3}} 

myinnerdict = {} 
myouterdict = {} 

def main(): 
    my_fh = open('text.txt', 'r') 
    for line in my_fh: 
     newline = line.strip().split() 

     myinnerdict['FQHN'] = newline[1] 
     myinnerdict['IP'] = newline[2] 
     # Note this copy here 
     myouterdict[newline[0]] = myinnerdict.copy() 
    print(myouterdict) 
    # Remember to close the file! 
    my_fh.close() 

if __name__ == "__main__": 
    main() 

とにかく、あなたもちょうどすぐに新しく作成された辞書を割り当てることができます:何をする必要がある.copy()それ以上(.copy()は、辞書の内容をコピーしますが、新しい参照がhere続きを読むせないことに注意してください)です変数を使用する代わりにオブジェクトを使用します。

mydict = {} 

def main(): 
    my_fh = open('test.txt', 'r') 
    for line in my_fh: 
     newline = line.strip().split() 
     mydict[newline[0]] = {"FQHN": newline[1], "IP": newline[2]} 
    print(mydict) 
    my_fh.close() 

if __name__ == "__main__": 
    main() 
1

これは、innerdictに同じdictオブジェクトを再利用しているために発生しています。ループ内に新しいdictオブジェクトを作成する必要があります。

myouterdict={} 

def main(): 
    my_fh = open('text.txt', 'r') 
    for line in my_fh: 
     myinnerdict={} 
     newline = line.strip().split() # get ride of the '\n' and make it a inner list . 
     #print(newline) 
     myinnerdict['FQHN']=newline[1] 
     myinnerdict['IP']=newline[2] 
     #print(myinnerdict) 
     #print(newline[0]) 
     myouterdict[newline[0]]=myinnerdict 
    print(myouterdict) 

if __name__ == "__main__": 
    main() 
関連する問題