簡體   English   中英

在Python中從csv文件創建嵌套字典

[英]Creating a nested dictionary from a csv file in 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]}
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)

創建帶有空字典作為缺失鍵的默認值的defaultdict ,並像這樣使用它:

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

您的情況有一個困難:您想要一個嵌套字典,所以我們需要一個dictdefaultdictdefaultdict

我們提供給defaultdict的參數必須是可調用的,因此我們不能編寫類似於defaultdict(defaultdict(dict)) ,因為defaultdict(dict)defaultdict ,而不是函數。 一種實現方法是使用functools.partial創建defaultdict_of_dict函數,我們可以將其傳遞給主defaultdict

我想出了如何使其工作。

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)

您可以嘗試使用以下簡短版本:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM