IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python 字典类型的嵌套 -> 正文阅读

[Python知识库]python 字典类型的嵌套

字典类型的嵌套

字典类型中,键值对的值可以是任意的数据类型,比如列表,元组,当然也可以是另一个字典

dt = {
'张三':{'学号':201111, '年级':2020, '专业':'计算机'},
'李四':{'学号':201112, '年级':2020, '专业':'英语'}
}

print(dt['张三'])            #{'学号': 201111, '年级': 2020, '专业': '计算机'}
print(dt['李四']['年级'])     #2020

下面po一道这学期让我印象很深的一道题:

现有一个文件oxforddata.txt,包含一个城市多年的天气数据,部分内容为:

?其中第1,2行是位置信息,3-5行是表中一些特殊符号的说明,第6行是下面表格的表头,第7是表头的单位,从第8行开始的就是具体的数据。

将上述文件的数据部分(即文件第8行开始)解析成一个多级字典,并返回这个字典。字典最外层键为年份(第一列),第二层键为月份(第二列),最内层键为其余列的数据项名(tmax, tmin, ...)

假设解析出来的字典名为dat,那么当访问:

  • dat[1853][1]['tmax']时,应该返回8.4

  • dat[1853][1]['sun']时,应该返回None

数据中缺失的部分(标注为---)用PythonNone值代替,数据上标注的一些特殊符号一律忽略。

第一步:打开文件,将"---"替换为"None",清除文件中的特殊符号

path = "src/step6/oxforddata.txt"
file_data=""
with open(path,"r",encoding="utf-8") as f:
        for line in f:
            if "---" in line:
                line=line.replace("---","None")
            if "*" in line:
                line=line.replace("*","")
            file_data+=line
with open(path,"w",encoding="utf-8") as f:
        f.write(file_data)

顺便复习一下文件的打开模式:

?

第二步: 用split()将较难处理的字符串分割成列表。由于该文件从第八行才开始有具体数据,我们跳过前七行

with open(path, "r+") as f:
        for line in islice(f, 7, None):
            line.split()

第三步:开始嵌套

y={}

with open(path, "r") as f:  
        for line in islice(f, 7, None):
        #tmax,tmin,sf,rain,sun分别为第一级字典
            tma['tmax']=line.split()[2]
            tmi['tmin']=line.split()[3]
            if line.split()[4] != "None":
                a['af']=float(line.split()[4])
            else:
                a['af']=line.split()[4]
            ra['rain']=line.split()[5]
            su['sun']=line.split()[6]
        #以月份为键,创建第二级字典
        #假设解析出来的字典名为dat,那么当访问dat[1853][1]时,应该返回1853年1月所有上述参数
            m[int(line.split()[1])]={'tmax':tma['tmax'],'tmin':tmi['tmin'],'af':a['af'],'rain':ra['rain'],'sun':su['sun']}
        #以年份为键,创建第三级字典。假设解析出来的字典名为dat,那么当访问dat[1853]时,应该返回1853年12个月的数据
        #该级字典不能直接按上面的方法嵌套。例如,1853年5月的数据会覆盖1853年4月的数据
            if int(line.split()[0]) not in y.keys():   #如果该年份是第一次出现
                y[int(line.split()[0])]={}
                y[int(line.split()[0])][int(line.split()[1])]=m[int(line.split()[1])]
            else:    
                y[int(line.split()[0])][int(line.split()[1])]=m[int(line.split()[1])]

return y

第四步:测试输出。

将上面的代码整合到函数Parse()中,返回一个多级字典。

n = int(input())
dat = Parse()
for s in range(n):
    cmd = input().split()
    y = int(cmd[0])
    m = int(cmd[1])
    t = cmd[2]
    print(dat[y][m][t])


  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:24:11  更:2021-12-04 13:24:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:55:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码