获取天气数据问题【python】
任务描述
本关任务:利用天气数据制作一个简单的Pyhton字典,用户从该字典中提取相关天气数据。
相关知识
为完成本关任务,你可能需要以下知识点:
字典的创建与操作(略)
字典类型的嵌套
文本文件的简单读写操作(略)
字符串的简单操作(略)
字典类型的嵌套
字典类型中,键值对的值可以是任意的数据类型,因此也可以是另一个字典,通过这种方式,可对更加复杂的数据进行表达,以下代码即使用一个嵌套的字典表达了一组学生信息,字典dt中的2个键值对的值也是字典类型:
dt = {
'张三':{'学号':201111, '年级':2020, '专业':'计算机'},
'李四':{'学号':201112, '年级':2020, '专业':'英语'}
}
通过不同层次的键,可获得两层字典中的值:
print(dt['张三'])
print(dt['李四']['年级'])
输出如下:
{'学号': 201111, '年级': 2020, '专业': '计算机'}
2020
当然,值也可以是列表、元组等各类其他的数据类型。
编程要求
现有一个文件oxforddata.txt,包含一个城市多年的天气数据,部分内容为:
yyyy mm tmax tmin af rain sundegC degC days mm hours
1853 1 8.4 2.7 4 62.8 ---
1853 2 3.2 -1.8 19 29.3 ---
1853 3 7.7 -0.6 20 25.9 ---
1853 4 12.6 4.5 0 60.1 ---
1853 5 16.8 6.1 0 59.5 ---
1853 6 20.1 10.7 0 82.0 ---
1853 7 21.2 12.2 0 86.2 ---
1853 8 20.2 10.8 0 72.3 ---
1853 9 17.3 8.4 0 51.3 ---
1853 10 13.9 7.4 0 102.3 ---
1853 11 8.7 2.3 10 49.6 ---
1853 12 3.7 -1.3 19 10.7 ---
1854 1 6.7 1.5 11 54.5 ---
1854 2 8.0 0.6 12 22.6 ---
......(此处省略若干行)
1953 1 5.4 0.8 13 21.8 42.5
1953 2 7.3 1.1 11 40.4 75.9
1953 3 10.8 0.3 17 17.2 140.7
1953 4 12.5 3.5 1 53.0 183.3
1953 5 17.9 8.2 0 42.8 223.0
1953 6 18.7 10.5 0 40.5 139.7
1953 7 20.4 11.7 0 82.1 203.4
1953 8 21.7 12.2 0 74.1 237.4
1953 9 18.6 10.0 0 47.3 151.7
1953 10 14.0 6.5 0 56.0 84.1
1953 11 11.3 5.9 0 39.7 54.4
1953 12 9.5 5.0 0 18.0 28.4
其中第1行是数据的表头(分别表示年、月、最高温度、最低温度等信息),第2行是数据对应的单位,从第3行开始是具体的数据。
在右侧编辑器中有个函数Parse,要求在这个函数中,将上述文件的数据部分(即文件第3行开始)解析成一个多级字典,并返回这个字典。字典最外层键为年份(第一列),第二层键为月份(第二列),最内层键为其余列的数据项名(tmax, tmin, ...),形式如下:
{1853: {1: {'tmax': 8.4, 'tmin': 2.7, 'af': 4, 'rain': 62.8, 'sun': None}, 2: {'tmax': 3.2, 'tmin': -1.8, 'af': 19, 'rain': 29.3, 'sun': None}, 3: {'tmax': 7.7, 'tmin': -0.6, 'af': 20, 'rain': 25.9, 'sun': None}, 4: {'tmax': 12.6, 'tmin': 4.5, 'af': 0, 'rain': 60.1, 'sun': None}, 5: {'tmax': 16.8, 'tmin': 6.1, 'af': 0, 'rain': 59.5, 'sun': None}, 6: {'tmax': 20.1, 'tmin': 10.7, 'af': 0, 'rain': 82.0, 'sun': None}, 7: {'tmax': 21.2, 'tmin': 12.2, 'af': 0, 'rain': 86.2, 'sun': None}, 8: {'tmax': 20.2, 'tmin': 10.8, 'af': 0, 'rain': 72.3, 'sun': None}, 9: {'tmax': 17.3, 'tmin': 8.4, 'af': 0, 'rain': 51.3, 'sun': None},10: {'tmax': 13.9, 'tmin': 7.4, 'af': 0, 'rain': 102.3, 'sun': None}, 11: {'tmax': 8.7, 'tmin': 2.3, 'af': 10, 'rain': 49.6, 'sun': None}, 12: {'tmax': 3.7, 'tmin': -1.3, 'af': 19, 'rain': 10.7, 'sun': None}}, 1854: {1: {'tmax': 6.7, 'tmin': 1.5, 'af': 11, 'rain': 54.5, 'sun': None}, 2: {'tmax': 8.0, 'tmin': 0.6, 'af': 12, 'rain': 22.6, 'sun': None}, ......(此处省略若干行)1953: {1: {'tmax': 5.4, 'tmin': 0.8, 'af': 13, 'rain': 21.8, 'sun': 42.5}, 2: {'tmax': 7.3, 'tmin': 1.1, 'af': 11, 'rain': 40.4, 'sun': 75.9}, 3: {'tmax': 10.8, 'tmin': 0.3, 'af': 17, 'rain': 17.2, 'sun': 140.7}, 4: {'tmax': 12.5, 'tmin': 3.5, 'af': 1, 'rain': 53.0, 'sun': 183.3}, 5: {'tmax': 17.9, 'tmin': 8.2, 'af': 0, 'rain': 42.8, 'sun': 223.0}, 6: {'tmax': 18.7, 'tmin': 10.5, 'af': 0, 'rain': 40.5, 'sun': 139.7}, 7: {'tmax': 20.4, 'tmin': 11.7, 'af': 0, 'rain': 82.1, 'sun': 203.4}, 8: {'tmax': 21.7, 'tmin': 12.2, 'af': 0, 'rain': 74.1, 'sun': 237.4}, 9: {'tmax': 18.6, 'tmin': 10.0, 'af': 0, 'rain': 47.3, 'sun': 151.7}, 10: {'tmax': 14.0, 'tmin': 6.5, 'af': 0, 'rain': 56.0, 'sun': 84.1}, 11: {'tmax': 11.3, 'tmin': 5.9, 'af': 0, 'rain': 39.7, 'sun': 54.4}, 12: {'tmax': 9.5, 'tmin': 5.0, 'af': 0, 'rain': 18.0, 'sun': 28.4}}
}
假设解析出来的字典名为dat,那么当访问:
dat[1853][1]['tmax']时,应该返回8.4;
dat[1853][1]['sun']时,应该返回None。
数据中缺失的部分(标注为---)用Python的None值代替。
输入数据由评测系统读取用于查询从Parse函数返回的字典,期间产生的输出将与规定的输出进行比较,详细要求请见测试说明。
输入输出示例
输入样例1:
`3`
`1853 1 tmax`
`1853 1 sun`
`2018 10 af`
输出样例1:
8.4
None
无对应数据
def Parse():with open('oxforddata.txt','r',encoding='utf-8') as f:txt=f.read() #读取文件中的所有内容以字符串的形式存储在变量txt中lines=txt.split('\n') #得到列表lines,如['yyyy mm tmax tmin af rain sun', ' degC degC days mm hours', '1853 1 8.4 2.7 4 62.8 ---',......],省略号表示后面还有数据未列出#将文件内容解析成一个多级字典,并返回# 请在此添加实现代码 ## ********** Begin *********#data={}for line in lines:if line:items=line.split()if len(items)==7:year,month,tmax,tmin,af,rain,sun=itemsif year not in data:data[year]={}data[year][month]={'tmax':tmax,'tmin':tmin,'af':af,'rain':rain,'sun':sun}return data# ********** End **********#if __name__ == '__main__':# 调用Parase函数,用户可利用返回的多级字典查询所需信息# ********** Begin *********#weather_dict=Parse()n=int(input())for i in range(n):try:year,month,things=input().split(' ')if weather_dict[year][month][things]=='---':print('None')else:print(weather_dict[year][month][things])except:print('无对应数据')# ********** End **********#