zoukankan      html  css  js  c++  java
  • 扎实基础深入篇(五):字典也就是个弟弟

    在本篇博客中,你将能学习到能够将相关信息关联起来的Python字典,以及一些对字典的操作。

    在讲正事之前,不能忘了上一篇博客布置下来的作业:

    执行以下操作以创建一个程序,该程序模拟网站如何确保每个人都有唯一的用户名。
     •列出包含五个或更多用户名的列表current_users;再列出包含五个新用户名的列表new_users,
    确保一个或两个新用户名也在当前用户列表中。
     •循环浏览新用户列表,查看每个新用户名是否已被使用。如果有,请打印一条消息,说明此人需要输入新的用户名。
    如果没有使用用户名,请打印一条消息,说明用户名可用。
     •确保你的比较不区分大小写。如果使用了“john”,则不应接受“JOHN”

    答案如下:

    current_users=["Master","paopao","mary","Alice","jack"]
    new_users=["mack","tom","Mary","alice","james"]
    current_users_1=[]
    for oldname in current_users:
        oldname=oldname.lower()
        current_users_1.append(oldname)
    for newname in new_users:
        if newname.lower() in current_users_1:
            print(newname,"你好,你注册的名字已被占用,请重新注册。")
        else:
            print(newname,"你好,你注册的名字可用。")

    输出结果:

    mack 你好,你注册的名字可用。
    tom 你好,你注册的名字可用。
    Mary 你好,你注册的名字已被占用,请重新注册。
    alice 你好,你注册的名字已被占用,请重新注册。
    james 你好,你注册的名字可用

    如果有对本段代码不懂的同学,可以亲自来问我。当然,有更好优化代码方案的,请务必告诉我。

    一个简单的字典示例

    student={"name":"master","age":18}
    print(student["name"])
    print(student["age"])

     字典student存储了一个学生的名字和年龄,使用print()来打印结果,会看见:

    master
    18

    字典的概念

    在python中,字典是一系列的键-值对,每一个键都与一个值相对应,使用的符号是大括号{ }。

    你可以使用键来访问与之相对应的值,与键相关联的值可以是数字、字符串、列表乃至字典。

    字典dict的公式:{key1:value1,key2:value2,...}

    键和值之间用冒号分隔,键-值对与键值对用逗号隔开。

    创建字典并学会如何访问值

    我们来创造一个包含更多学生信息的字典:

    student={
        "name":"master",
        "age":18,
        "sex":"",
        "class":"软件一班",
        "teacher":"Mr.Lee"
        }

    我们知道,去使用键来访问值:

    #获取学生的名字
    print(student["name"])
    #获取学生的性别
    print(student["sex"])
    #获取学生的班级
    print(student["class"])

    可以看到结果如下所示:

    master

    软件一班

    添加新的键-值对和修改键的值

    首先复习一下列表如果想要添加新的元素的时候,有哪几种方法:

    list_1.append() :末尾追加一个新的元素

    list_1.insert():某索引位置加入新的元素

    小提示:为什么不直接命名list?--->关键词不能用来做变量名

    字典添加新的键-值对相对于列表是非常方便的:

    student["school"]="哈佛大学"
    student["address"]="热河路"

    然后我们print(student)来看看字典发生了怎么样的变化:

    {
        'name': 'master',
        'age': 18,
        'sex': '',
        'class': '软件一班',
        'teacher': 'Mr.Lee',
        'school': '哈佛大学',
        'address': '热河路'
    }

    是不是非常快速多了,只需要给字典的索引上创一个新的键,等于号后面写上所对应的值,就可以产生新的键-值对了。

    那么实际上我这个student字典非常不贴实际的,存在吹牛逼的成分,master考上哈佛大学,有那么牛逼吗?

    那么如何修改字典里面的值呢?

    student["age"]=20
    student["school"]="野鸡大学"
    print(student)

    我们可以发现,字典修改值和列表修改元素的方法都一样,给指定索引重新定义数据就可以完成修改:

    {
        'name': 'master',
        'age': 20, 
        'sex': '',
        'class': '软件一班', 
        'teacher': 'Mr.Lee', 
        'school': '野鸡大学',
        'address': '热河路'
    }

    现在这个student字典里的信息是不是看上去顺眼多了?

    删除键-值对

    我们在上面使用student字典的过程中,键"teacher":值"Mr.Lee"这一对并没有用过。

    所以,我们就考虑删除掉这一对,删除的方法使用del:

    del student["teacher"]
    print(student)

    删除的方法,字典和列表也一样,用del删除指定的键,就能删除掉键-值对,不再出现。

    {
        'name': 'master',
        'age': 20, 
        'sex': '',
        'class': '软件一班', 
        'school': '野鸡大学',
        'address': '热河路'
    }

    使用for遍历字典

    ①遍历所有的键-值对

    首先有student字典:

    {
        'name': 'master',
        'age': 20, 
        'sex': '',
        'class': '软件一班', 
        'school': '野鸡大学',
        'address': '热河路'
    }

    如何将这些数据更为直观的键-值打印在窗口上:

    for key,value in student.items():
        print("键:",key)
        print("值:",value)
        print()

    要注意的是,字典并不能直接与for相结合使用:

    这时,items()应运而生,它的作用是把字典转换为列表形式,键-值对转换为元组。

    dict_items([('name', 'master'), ('age', 20), ('sex', '男'), ('class', '软件一班'), ('school', '野鸡大学'), ('address', '热河路')])

    输出结果:

    键: name
    值: master

    键: age
    值: 20

    键: sex
    值: 男

    键: class
    值: 软件一班

    键: school
    值: 野鸡大学

    键: address
    值: 热河路

    ②遍历字典中的所有键

    在这儿,我们要重新定义一个字典,来帮助你完成更好理解这个小节:

    一个学生字典,学生名字为键,年龄为值

    student={
        "张三":18,
        "李四":20,
        "王五":22,
        "马六":23
    }

    现在,我要遍历出这个字典的所有人的名字:

    for name in student.keys():
        print(name)

    keys()方法极为有用,也不需要经过一些复杂的转换列表操作,可以直接提取出所有的键。

    输出结果:

    张三
    李四
    王五
    马六

    ③遍历字典中的所有值

    和上面方法一样,直接使用values方法提取所有的值。

    for name in student.values():
        print(name)

    输出结果:

    18
    20
    22
    23

    字典的嵌套用法

    ①列表存储字典元素

    我们创建三个学生信息的字典,含有姓名和年龄:

    student1={"name":"张三","age":18}
    student2={"name":"李四","age":19}
    student3={"name":"王五","age":20}

    然后,我们可以把这三个字典,存储到列表里作为元素:

    student_list=[student1,student2,student3]
    print(student_list)

    输出结果:

    [{'name': '张三', 'age': 18}, {'name': '李四', 'age': 19}, {'name': '王五', 'age': 20}]

    ②字典存储列表值

    我在上面提过一句话:

    你可以使用键来访问与之相对应的值,与键相关联的值可以是数字、字符串、列表乃至字典。

    在上面我们已经见识了数字和字符串类型作为值,现在来看一看列表作为值的情况:

    在上面中,我们认识了张三,李四和王五,现在调查他们的爱好,得到下面的结果

    张三的爱好:编程,游泳和打游戏

    李四的爱好:编程,看书和踢足球

    王五的爱好:撩妹,喝酒和打游戏

    然后,他们都是来自软件一班,就用appclass_one作为字典变量,

    他们的名字作为键,他们的爱好作为值并用列表的形式:

    appclass_one={
        "张三":["编程","游泳","打游戏"],
        "李四":["编程","看书","踢足球"],
        "王五":["撩妹","喝酒","打游戏"]
    }

    现在,我们将这个字典数据以更为直观的形式出现在打印窗口:

    for people,favourites in appclass_one.items():
        print(people+"的爱好如下:")
        for favourite in favourites:
            print("	",favourite)
        print()

    先来看看输出结果:

    张三的爱好如下:
             编程
             游泳
             打游戏

    李四的爱好如下:
             编程
             看书
             踢足球

    王五的爱好如下:
             撩妹
             喝酒
             打游戏

    那么要考虑到一些零基础的同学,可能会一时无法理解代码的原理,我可以给出大概的解释如下:

    第一行肯定是先提取出键和值出来,items()是转换成列表形式,

    缩进之后来到第二行,打印出人名的爱好消息,这时候如果来到第三行直接打印,

    第三行直接是一行列表形式的爱好,肯定不够直观,而且我不想要看见列表的符号,

    所以再对这个列表进行提取每个元素处理,把每个元素但独占一行,

    “ ”是横向制表符,也就是制造横向空格,让整体效果更为直观。

    最后一行的print()属于换行,然后继续访问字典里第二个人名……

    ③字典存储字典值

    字典的值也可以是字典的形式,比如定义一个班级字典,里面有很多学生的信息:

    appclass_one={
        "student1":{"name":"张三","age":18},
        "student2":{"name":"李四","age":19},
        "student3":{"name":"王五","age":20}
    }

    如果想像上面一样出题目的话,其实也不用浪费笔墨,多用一次items()方法即可。

    作业来袭:

    创建一个名为cities的字典,其中将三个城市名用作键,对于每个城市的所属省份、人口数、是否为省会等等创建一个字典作为值。

    然后以更为直观的形式打印出这些信息在输出窗口。

    恭喜你!字典在你面前成功地做了弟弟,接下来的一篇博客你将接触到while循环和input获取用户输入。

    建议再次复习往期博客加强复习!

  • 相关阅读:
    RMI几种公布和引用服务的方式
    mysql 多日志表结果集合拼接存储过程
    USRP通信的结构体和常量(上位机、下位机共用)
    Flash Builder4破解步骤
    leetcode 217 Contains Duplicate 数组中是否有反复的数字
    关于权限表的基本设计
    Objective-C之成魔之路【7-类、对象和方法】
    vs2008C1902程序数据库管理不匹配
    配置hadoop集群一
    BZOJ 2338 HNOI2011 数矩形 计算几何
  • 原文地址:https://www.cnblogs.com/Masterpaopao/p/10324640.html
Copyright © 2011-2022 走看看