关于这个问题,我一直在撞墙,我觉得我真的很亲密!但还没到那里。 任何帮助都非常感谢。问题的格式需要一些解释,但我不认为编码本身对你们来说会非常困难。 我正在尝试编写一个函数来获取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)
答案 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