添加键值对的问题是嵌套字典

时间:2015-11-09 05:27:42

标签: python csv dictionary

关于这个问题,我一直在撞墙,我觉得我真的很亲密!但还没到那里。 任何帮助都非常感谢。问题的格式需要一些解释,但我不认为编码本身对你们来说会非常困难。 我正在尝试编写一个函数来获取CSV文件中的信息并创建嵌套字典。 CSV文件中的行如下所示:

....  
2001,Spring,AFR 202 - 01,18,30,T|F,01:30 pm - 02:40 pm  
2002,Fall,AFR 208 - 01,29,30,M|Th,09:50 am - 11:00 am   
....

CSV中有几百行。你没有必要密切关注任何事情 自从我照顾以来,除了年份和季节(每行前两个)之外的CSV中的值 涉及到的东西。

该函数应打印出一个嵌套字典,其中日历年为顶层的键。 这些键中的每一个都具有作为字典的值,而字典又具有作为两个学期秋季和春季的键。 对于每个季节,我都会关联一个词典列表,每个词典对应一个词典。

所以,它应该看起来像这样(为了可读性而格式化):

{
  "2001": {
    "Fall": [
      {
        "one": 40,
        "two": "AFR 207 - 01",
        "three": "W",
        "four": 44,
        "five": "Fall",
        "six": "07:00 pm - 09:30 pm",
        "seven": "2001"
      },
      ...
    ],
    "Spring": [
      {
        ...
      },
      ...
    ]
  },
  "2002" : {
    ...
  },
  ...
}

另一种说法,每年都是最大字典中的关键字,每个键值对看起来都像这样:

year : { fall:[{ ...information...}],spring[{...information}] }

对于CSV文件中的每一行,我将{...信息...}部分放下,并且每年我都可以从CSV中提取行并将其附加到适当的年份。不过,我遇到了麻烦,让'秋季'和'春季'列表出现在'年'字典里面。

注意:allClassInfo中的条目是通过格式化CSV文件中的行来创建的,它们如下所示:

....
{'four': 15, 'one': 15, 'three': 'M|Th', 'six': '01:30 pm - 02:40 pm', 'two': 'WRIT 135 - 01', 'five': 'Fall', 'seven': '2014'},
{'four': 15, 'one': 15, 'three': 'M|Th', 'six': '02:50 pm - 04:00 pm', 'two': 'WRIT 140 - 01', 'five': 'Fall', 'seven': '2014'}
....

我的代码:

def byYear(filename):
    allClassInfo = classInfo(filename)
    bigDict={}
    for entry in allClassInfo:

        if ((entry.get('seven') in bigDict)  == False):
            if (entry.get('five') == 'Spring'):
                bigDict[entry.get('year')]= {'Spring':[entry]}

        if ((entry.get('seven') in bigDict)  == False):
            if (entry.get('five') == 'Fall'):
                bigDict[entry.get('year')]['Fall'] = [{'Fall':[entry]}]

    print bigDict

byYear('name.csv')

输出的内容如下:

'2008': {'Spring': [{'four': 50, 'one': 5, 'three': 'T|F', 'six': '09:50 am - 11:00 am', 'two': 'AFR 105 - 01', 'five': 'Spring', 'seven': '2008'}]}, 
'2009': {'Spring': [{'four': 25, 'one': 11, 'three': 'M|W|Th', 'six': '08:30 am - 09:40 am', 'two': 'AFR 102 - 01', 'five': 'Spring', 'seven': '2009'}]}

但没有坠落信息。

我还没有到目前为止,但每年一次,我会包括所有其他信息,包括这样的代码:

    if ((entry.get('year') in bigDict)  == True):
        if (entry.get('semester') == 'Fall'):
            bigDict[entry.get('year')]['Fall'].append('entry')
        if (entry.get('semester') == 'Spring'):
            bigDict[entry.get('year')]['Spring'].append(entry)

2 个答案:

答案 0 :(得分:0)

if (entry.get('five') == 'Spring'):
    bigDict[entry.get('year')]= {'Spring':[entry]}

此行将覆盖bigDict[entry.get('year')]中的内容。 要将键值对添加到dict,您可以:

if (entry.get('five') == 'Spring'):
    bigDict[entry.get('year')]['Spring'] = [entry]

答案 1 :(得分:0)

Python词典具有setdefault函数,这将使这更容易。如果给定的密钥已经存在于dict中,它将返回密钥的值,否则它将创建密钥/值对。

bigDict = {}
for entry in allClassInfo:
    year = entry.get('seven')
    season = entry.get('five')

    # first, make sure we have an entry for this year in bigDict
    yearDict = bigDict.setdefault(year, {})
    # then make an entry for this season
    list = yearDict.setdefault(season, [])
    # then, append to the list
    list.append(entry)

注意:这是有效的,因为插入的dict是通过引用返回的。对于简单值类型,请使用get。例如。这是你计算条目的方式:

counts = {}
for entry in allClassInfo:
    year = entry.get('seven')
    counts[year] = counts.get(year, 0) + 1