python - 无法访问Python中的嵌套字典

标签 python loops dictionary

简介:

我正在尝试访问 python 中的嵌套字典元素,如下所示:

{'CA':{'1':'3','2':'3','3':'3'},'IL': {'1':'31','2':'45','3':'23'},...}

首先,我从 Excel 文件中读取内容,在其中获取州名称,然后为每个州分配一个字典。我就是这样做的:

xls_file = pd.ExcelFile('D:/CollegeScorecardDataDictionary-08-18-2016.xlsx')
dfEx = xls_file.parse('Church')  # Parse Church sheet
for (i, item) in enumerate(stateName):
     if stateChurchDict.get(item)<>None:
            continue 
     else:
            stateChurchDict[item] = dict

一旦循环被迭代,我就会得到这样的结果:

{'CA':<type dict>,'IL': <type dict>,'AL': <type dict>...}

每个州都有很多教堂,可以分类为 '1', '2' or '3' 这是我在嵌套字典中获取数字的地方。

我的问题是我想引用某种状态的嵌套字典,例如

stateChurchDict['AL']['3']

并获取某个州的类别“3”下的教堂数量。但是,首先我必须检查它是否为空,如果为空则必须添加该值。因此,我想出了这个:

for (i, item) in enumerate(stateName):
            if stateChurchDict[stateName[i-1]]['3'] <> None:
                stateChurchDict.update({stateChurchDict[stateName[i-1]]['3']: stateChurchDict[stateName[i-1]]['3'] + 1})
            else:
                stateChurchDict[stateName[i-1]]['3'] = 1

但是,这个stateChurchDict[stateName[i-1]]['3']但是无法访问嵌套字典stateName[i-1] == 'AL'它调用类似 stateChurchDict['AL']['3'] 的元素但还是什么都没有。

非常感谢任何帮助。

为了更好的解释,我发布了全部内容:

import pandas as pd
from collections import defaultdict, Counter
def IsNumeric(x):
    try:
        float(x)
        return x
    except:
        return 0
xls_file = pd.ExcelFile('D:/CollegeScorecardDataDictionary-08-18-2016.xlsx')
dfEx = xls_file.parse('Church')  # Parse data_dictionary sheet
dfCsv = pd.read_csv('D:/MERGED2014_15_PP.csv', low_memory=False)
churchCode = dfEx.Code  # Label column
churchName = dfEx.ChurchName  # Value column
churchCategory = dfEx.Category  # Church category
relafil = dfCsv.RELAFFIL  # Religious Id in CSV
stateName = dfCsv.STABBR  # Name of state
churchList = {}  # Create dictionary to store churches
stateChurchDict = defaultdict(Counter)  # Create dictionary to store churches by state
stateChurchTemp = {} #Sepate dictionary for churches by state
# Put values into dictionary
for (i, v) in enumerate(churchCode):
    churchList[v] = churchCategory[i] #Assigns a category to each church in state

for (i, item) in enumerate(stateName): #Create a dictionary as a value to each state in the stateChurchList dictionary
    if item <> None:
        if stateChurchDict.get(item) <> None:
            continue
        else:
            stateChurchDict[item] = {}

for (i, item) in enumerate(stateName): #Iterate through states and count the number of churches by categories. Once the state name is changed, the number needs to be transferred from stateChurchTemp to stateChurchDict
    if IsNumeric(relafil[i]) <> 0:
        if i >= 1 and item <> stateName[i - 1]:
            if stateChurchDict[stateName[i - 1]][3] <> None:
                stateChurchDict.update({stateChurchDict[stateName[i - 1]][3]: stateChurchDict[stateName[i - 1]][
                                                                                    3] + IsNumeric(
                    stateChurchTemp[3])})
            else:
                stateChurchDict[stateName[i - 1]][3] = IsNumeric(stateChurchTemp[3])
            if stateChurchDict[stateName[i - 1]][2] <> None:
                stateChurchDict.update({stateChurchDict[stateName[i - 1]][2]: stateChurchDict[stateName[i - 1]][
                                                                                    2] + IsNumeric(
                    stateChurchTemp[2])})
            else:
                stateChurchDict[stateName[i - 1]][2] = IsNumeric(stateChurchTemp[2])
            if stateChurchDict[stateName[i - 1]][1] <> None:
                stateChurchDict.update({stateChurchDict[stateName[i - 1]][1]: stateChurchDict[stateName[i - 1]][
                                                                                    1] + IsNumeric(
                    stateChurchTemp[1])})
            else:
                stateChurchDict[stateName[i - 1]][1] = IsNumeric(stateChurchTemp[1])
        if churchList.get(relafil[i]) <> None and stateChurchTemp.get(churchList.get(relafil[i])) <> None:
            stateChurchTemp.update({churchList.get(relafil[i]): stateChurchTemp.get(churchList.get(relafil[i])) + 1})
        else:
            stateChurchTemp[churchList.get(relafil[i])] = 1
print stateChurchDict

最佳答案

您没有调用嵌套字典,而是尝试更新主字典。请更改此行:

stateChurchDict.update({stateChurchDict[stateName[i - 1]][2]: stateChurchDict[stateName[i - 1]][2] + IsNumeric(stateChurchTemp[2])})

这样:

stateChurchDict.get(statename[i-1]).update({3: stateChurchDict[stateName[i - 1]][3] + IsNumeric(stateChurchTemp[3])})

关于python - 无法访问Python中的嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40208284/

相关文章:

c# - 理解 Dictionary 类中的 TKey 和 TValue 参数

python - 在 python 中反转 dict 和访问它的值的正确方法是什么?

python - 为 pandas 列创建类别计数字典

python - 使用 subprocess.Popen 应用环境变量

javascript - 如果相同位置的项目相等,则比较数组项目(项目是数组)

python - 在 Ubuntu 上安装 pylibmc

javascript - for循环打印出多个具有相似名称的数组

string - 如何在 mips 程序集中迭代字符串

python - 无法弄清楚如何清除随机森林中的 NaN

Python:如何覆盖方法调用中的数据属性?