2017-06-28 20 views
0

CSVファイルから情報を読み込みました。ファイルの反復情報をマップするためにネストされた辞書を使用しています。ファイルのすべての行について、このファイルのネストされた辞書を作成するにはどうすればよいですか?データの例(ではない、実際のデータが、基本的に同じ考え方)Pythonでcsvファイルからネストされた辞書を作成する

State ,City/Region ,Questions ,Answers 
NY,Manhattan ,East/West Coast? ,East 
NY,Manhattan ,been there? ,yes 
NY,Brooklyn ,East/West Coast? ,East 
NY,Brooklyn ,been there? ,yes 
NY,Brooklyn ,Been to coney island? ,yes 
NY,Queens ,East/West Coast? ,East 
NY,Queens ,been there? ,yes 
NY ,Staten Island ,is island? ,yes 
MA,Boston ,East/West Coast? ,East 
MA,Boston ,like it there? ,yes 
MA,Pioneer Valley ,East/West Coast? ,East 
MA,Pioneer Valley ,city? ,no 
MA,Pioneer Valley ,college town? ,yes 
CA,Bay Area ,warm? ,yes 
CA ,Bay Area ,East/West Coast? ,West 
CA ,SoCal ,north or south? ,south 
CA ,SoCal ,warm ,yes 

だから、本質的に、マスター辞書には3つのキーを持っている:NY、MA、CA、それらのそれぞれは、キーとして市/地域との辞書を持っています、各都市/地域には質問と回答があります。
だから、それは非常にネストされた辞書のだろうが、私は、ファイル内のすべての行のためにそれを行うには、このための構文を把握することはできません。

ファイルを開こうとしましたが、forループを使って行を読み込み、 "、"で行を分割しました。このような何か:

for line in my_file: 
    line=line.split(",") 
    MasterDict[line[0]] = {line[1] : {} } 
    MasterDict[line[0]][line[1]] = {line[2] : line[3]} 
+4

あなたがこれまでに試してみました何を?コードがうまくいかないのはどうですか? –

+0

itertoolsからgroupby関数を見てみましょうhttps://docs.python.org/2/library/itertools.html#itertools.groupby –

+0

私はファイルをオープンしようとしましたが、forループを使用して行を読み込み、分割しました行は "、"で区切られています。このようなもの for my_file: line = line.split( "、") MasterDict [line] [1]:{}} MasterDict [line [0]] [line [ 1]] = {line [2]:line [3]} – question610

答えて

0
import csv 
from collections import defaultdict 
from functools import partial 

defaultdict_of_dict = partial(defaultdict, dict) 
master = defaultdict(defaultdict_of_dict) 

with open("data.txt", 'r') as f: 
    csv_reader = csv.reader(f) 
    next(csv_reader) # Skip the first line 
    for row in csv_reader: 
     state, city, question, answer = [field.strip() for field in row] 
     master[state][city][question] = answer 


print(master['NY']['Queens']) 
# {'been there?': 'yes', 'East/West Coast?': 'East'} 
print(master['NY']['Queens']['been there?']) 
# yes 

あなたが分割の世話をするcsvモジュールでCSVファイルを読み込むことができます。あなたが与えた

例のデータは、不要なスペースがいっぱいです。実際のデータと同じ場合は、stripでサニタイズします。

辞書に欠落しているキーを作成しないようにするには、defaultdictを使用します。これはデフォルト値で不足しているキーをオンザフライで作成します。

from collections import defaultdict 
d = defaultdict(dict) 

を逃したキーのデフォルト値として空のdictsとdefaultdictを作成し、このようにそれを使用する:たとえば、あなたができる

d["new_key"]["subkey"] = 5 
print(d) 
# defaultdict(<class 'dict'>, {'new_key': {'subkey': 5}}) 

あなたの内の1つの難しさがあります場合:ネストされた辞書が必要なので、defaultdictdefaultdictdict

defaultdictに与えるパラメータは呼び出し可能でなければならないので、defaultdict(defaultdict(dict))のように書くことはできません。defaultdict(dict)defaultdictであり、関数ではありません。それを達成するための一つの方法は、私たちがメインdefaultdictに渡すことができることを、defaultdict_of_dict関数を作成するためにfunctools.partialを使用することです。

0

私はそれが動作するように取得する方法を考え出しました。

import pprint 
MasterDict={} 
    my_file.readline() 
    for line in my_file: 
     line=line.split(",") 
     if line[0] not in MasterDict: 
      MasterDict[line[0]] = {} 
     if line[1]: 
      if line[1] not in MasterDict[line[0]]: 
       MasterDict[line[0]][line[1]] = [] 
      MasterDict[line[0]][line[1]].append((line[2], line[3])) 
    pp = pprint.PrettyPrinter(indent=4) 
    pp.pprint(MasterDict) 
0

あなたはこの少し短いバージョン試すことができます。

f = open(myfile).readlines() 

f = [i.strip('\n').split(',') for i in f] 

d = {i[0]:{i[1]:[]} for i in f[1:]} 

for i in f[1:]: 
    if i[1] not in d[i[0]]: 
     d[i[0]][i[1]] = i[2:] 
    else: 
     d[i[0]][i[1]].extend(i[2:]) 

print d 
関連する問題