Python 对字典的认知

字典与递归函数是使用中重要的知识点,现重新回顾了字典的相关内容。

说到字典想必大家小学时候都用到,记性中的现代汉语字典、新华字典,我们在用的时候是在索引页找到我们要找的内容,比如“好”,等找到之后,翻到对应的页码查看解释。在这里面说到的字典操作逻辑其实是一样的。

一、字典的说明:

首先在程序里面字典主要是用key(键值)与value(内容值)的组成来表示,这是固定搭配。比如用字典表示我的个人信息,代码如下

information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}

运行代码查看:可以运行。下面我们就分析下里面的信息:然后我们再好好看一下这些信息,我发现刚才定义的key值怎么都是字符串,然后value值可以是字符串也可以是数字,难道别的数据类型等不可以嘛,那我们继续多写几个字典看看。修改代码如下:

information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
information = {"name":"Oliver",age:25,"sex":"男","phone":13711234567}
information = {"name":"Oliver","age":25,1:"男","phone":13711234567}
information = {[name]:"Oliver","age":25,"sex":"男","phone":13711234567}
information = {"name":"Oliver","age":[name,哈哈],"sex":"男","phone":13711234567}
information = {(name):"Oliver","age":25,"sex":"男","phone":13711234567}
information = {"name":"Oliver","age":25,"sex":"男","phone":(13711234567)}
information = {"name":"Oliver","age":25,"sex":"男","phone":{13711234567:1,13711234562:2}}

运行之后为发现有些是报错的,但是有些又是正常的。原来对于key来说类型只能是str(字符串)、int(数字)、couple(元组)。而对于value来说什么类型都可以。

上面是定义一个字典,那是否可以函数创建一个字典呢。查看到有个内置函数dict(),可以这样自主创建。下面我们试着写写看看,代码如下:

list = ("大明","二明","张三","李四","王五")
dict00 = dict(a = 1,b=2,c=3)
dict01 = dict(zip(range(5),list))
dict02 = dict([(1,1),(2,2),(3,3)])

运行效果如下:发现,如果是用dict()内至的函数可以简单快速的创建我们想要的字典。

二、对应增删改查

现在我们可以自己定义一个字典或者创建一个我们想要的字典了,那业务场景肯定存在着对字典里面元素的增删改查等操作。

增加:

当我们要增加字典中的元素时,逻辑上我们应该得先知道我们要增加的哪个字典,然后才可以增加,就像吃饭,我们饿了要吃饭,可是得知道去哪家店点什么菜是吧。否则也不知道吃什么。那代码如下:

information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
information["height"] = 177
information["weight"] = 76

运行效果如下:这就增加了字典元素,仔细想想,这个是一个个添加,如果我需要添加几百上千个元素的话,那我岂不是要疯了。那如何批量增加呢,我暂时想到的是遍历来一个个添加,代码如下:

Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
add = {"height":177,"weight":76}
for num in add:
	Message[num] = add[num]
	print(Message)

运行程序如下:

 

删除:

对于删除来说跟增加差不多。删除有直接删掉字典、删除字典中的所有所有元素、提取某个元素并删除。代码如下:

Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
del Message["name"]    #删除key为name的值
Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
del Message       #删除整个字典
Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
Message.clear()     #删除所有元素
Message = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
Message.pop("name")    #获取某个值并删除


代码运行如下:感觉在这里面用的比较多的会是pop(),比如我们抽签,当我们抽到某个签的时候,应该先获取这个签的信息,然后还要在原先的签盒子里面拿掉这个签等等场景。

修改:

修改字典信息,我们可以理解为就是有一个新的字典,这个新的字典的元素覆盖原先的字典信息。我们可以直接update()内置函数即可,不用记别的内容。代码如下:

information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
Message = {"phone":999,"weight":177,"height":76}
information.update(Message)

运行效果如下:我们发现key--phone已经变成999了,而且后面也加上了身高跟体重。所以这个update就可以包含所有修改的可能性了。

查询

当我们有字典信息,需要被人为的调用查询。对于场景来说,我们基本是知道key值,来查找value值。那我们可以试着尝试写下,其实这个在第一个批量增加的时候就有提到过,代码如下:

information = {"name":"Oliver","age":25,"sex":"男","phone":13711234567}
information["name"]
information["age"]

运行效果如下

三、小案例说明:

场景是我们现在有一个考试成绩查询系统,在这系统里面有我们学生的考试成绩信息,需要有学生信息、考试科目、考试成绩的增删改查。

print("欢迎登陆学生成绩查询系统")
info = {
    "张三":
     {
        "语文":89,
        "数学":90,
        "英语":60
     },
    "李四":
     {
        "语文":66,
        "数学":66,
        "英语":66
     },
    "王五":
     {
        "语文":33,
        "数学":33,
        "英语":33
     }
			}

#首先做一个登录校验的一个函数
def act():
    usename = input("请输入您的姓名")
    if usename not in info:
        print("您的身份不不正确,请重新输入您的姓名")
        return act()
    else:
	print("欢迎{0}登陆学生成绩查询系统".format(usename))


#在做一个用户行为操作的函数
def oper():
    operation = int(input("请输入您要对学生信息、考试科目、考试成绩的操作,1:增加;2:删除;3:修改;4:查询;5:退出系统"))
    if  operation == 1:
        return student()
    elif  operation ==2:
        return delete()
    elif  operation ==3:
        return update()
    elif  operation ==4:
        return check()
    elif  operation ==5:
        exit()
    else:
	    print("填写信息有误哦!")
	    return oper()

#做用户增加的函数
#(1)首先是确认是在已有的学生信息增加学科还是新增加的学生
def student():
    global stuname
    stuname = input("请输入要增加的学生姓名->")
    if stuname in info:
        print("已有次学生的信息,请直接输入增加学科信息")
        sure = int(input("是否需要添加学科信息》1:需要,2:退出"))
        if sure == 1:
            return addscore()
        else:
            return oper()
    else:
        print("已创建学生信息,请输入需要增加的学科信息")
        sure = int(input("是否需要添加学科信息》1:需要,2:退出"))
        if sure == 1:
            return addscore()
        else:
            return oper()


#(2)现这添加需要增加的学科与成绩信息
def addscore():
    print("""------------------""")
    global object
    object = {}
    n = 1
    while n:
        stuobject = input("请输入需要增加的科目》")
        stuscore = int(input("请输入{0}的考试成绩》".format(stuobject)))
        object[stuobject] = stuobject
        info[stuname] = object
        confirm = input("请确认是否继续添加信息,继续输入是,退出输入否》")
        if confirm != "是" or confirm != "否":
            pass
        elif confirm == "是":
            continue
        elif confirm == "否":
            return oper()


#做一个用户查询的函数
def check():
    stuname01 =input("请输入需要查询的学生姓名》")
    if stuname01 not in info:
        print("查询信息不存在,请重新输入学生姓名")
        return check()
    else:
        print("{0}的成绩信息如下:{1}".format(stuname01,info[stuname01]))
        return  oper()

#做一个用户修改的函数
def update():
    confirm = input("请确认是否修改》")
    object01 ={}
    name = input("请输入学生姓名》")
    n = 1
    while n:
        stuobject = input("请输入需要修改的学科》")
        stuscore = int(input("请输入{0}的考试成绩》".format(stuobject)))
        object[stuobject] = stuobject
        info.update(object)
        confirm = input("请确认是否继续修改信息,继续输入是,退出输入否》")
        if confirm != "是" or confirm != "否":
            pass
        elif confirm == "是":
            continue
        elif confirm == "否":
            return oper( )

#做一个删除的函数
def delete():
    delname = input("请输入需要删除的学生名称》")
    num = int(input("删除需谨慎,请确认是删除该1,所有学科成绩还,2,某门课程成绩"))
    if num !=1 and num !=2:
        pass
    if num ==1:
        del info[delname]
    else:
        delobject = input("请输入需要删除的学科")
        del info[delname][delobject]
    sure = input("请确认是否需要继续操作,1》继续,2》退出")
    if sure !=1 and sure !=2:
        pass
    if sure ==1:
        return delete()
    else:
        return oper()

问题构想:

初步代码写完了,但是看起来有些傻瓜式,不够精简。现在想到三个问题:

1、有些信息都是重复的,比如有很多的if判断,当用户操作完一遍之后都要问一下是否继续操作,可能就会出现我们想要键入之外的值,那这个地方如果做成枚举类,只能有我们想要的,相对就会少一个类别判断。

2、还有就是在增删改查中用户操作不可能操作一次就完事儿了,势必存在呢多次操作,如果在代码中很好的嵌入while或者递归回调函数,这就解决了多次操作问题。

3、我们看下来总感觉有很多东西是重复的,是否可以规整在一起形成一种父子类呢,从而让代码看起来更简便与直接呢,我现在想到的是,比如每次函数调用的时候都要用户键入学生姓名,是否可以把键入学生姓名做成一个父类,子类做成printf输出的字符串不一样呢的区别,这样看起来直接又简洁等。

 

根据这些问题,看着手痒痒的小伙伴把代码再优化一下吧。

总结:

1、键(Key)必须是唯一的,但值(Value)则不必。值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

2、内置函数:dict()

用法:

class dict(**kwarg)    -------**kwargs -- 关键字
class dict(mapping, **kwarg)    ----------mapping -- 元素的容器
class dict(iterable, **kwarg)     ---------iterable -- 可迭代对象

3、增加:dict [key] =  value

4、删除:del   、dict.clear() 、dict.pop(key)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值