美文网首页
15天Python入门 Day 06:字典

15天Python入门 Day 06:字典

作者: 明日之丈 | 来源:发表于2018-08-14 11:09 被阅读48次

    举个栗子

    我们用字典来存储类似学生信息,既能有较好的结构,也能使代码更加简洁明了,如下:

    student={

    'id':'100001',

    'name':'Jack',

    'gender':'male',

    'age':19

    }

    print(type(student))

    print(student)

    像这样,用大括号({})包裹的内部由键值对构成的存储结构,我们就称之为“字典(dictionary)”。具体到细节部分,键值对格式如下:键:值,,键和值之间用冒号(:)分隔,键值对之间用逗号(,)进行区分。我们看看程序输出结果:

    {'id': '100001', 'name': 'Jack', 'gender': 'male', 'age': 19}

    [Finished in 0.2s]

    我们首先用type()函数输出student变量的类型,可以看出这的确是一个字典(dict);再看student的输出,也和我们的输入是一致的(当然,前提是你得忍受它难看的结构)。

    简单操作字典

    通过上面的程序,我们简单了解了字典的结构,下面我们来学习它的具体用法。

    访问字典

    用print()语句可以直接打印输出字典的全部内容,但是我们只想要取具体某值时该如何操作呢,继续看下面的例子:

    student={

    'id':'100001',

    'name':'Jack',

    'gender':'male',

    'age':19

    }

    print('My name is',student['name'])

    print('My id is',student['id'],',and I am',student['age'],'years old.')

    通过student变量的键(索引),我们就可以取出其对应值,输出结果如下:

    My name is Jack

    My id is 100001 ,and I am 19 years old.

    [Finished in 0.1s]

    可以看到,取出值的方式类似于(好吧,其实是一样)列表,请同学们留心。

    添加数据

    向字典中添加新的数据,或者更新数据也是通过类似列表的操作,如下:

    student={

    'id':'100001',

    'name':'Jack',

    'gender':'male',

    'age':19

    }

    student['class']='1'

    student['name']='Lucy'

    print(student)

    向字典里添加一个字段(信息),class班级。不同于取出值,这是一个全新的(......总会想到渣渣辉)“键”,Python程序会自动把键和对应值添加到字典当中,而且,因为是一一对应的关系,字典内部并不存在前后顺序这样的说法。而当键是原本已存在的键时,在我们对其赋值后,新值就会把原来的值覆盖。程序运行结果如下:

    {'id': '100001', 'name': 'Lucy', 'gender': 'male', 'age': 19, 'class': '1'}

    [Finished in 0.1s]

    看到输出的内容,‘name’字段已经更新为‘Lucy’(可以是个男的),并且字典当中新增了‘class’字段。

    既然有了上述新增数据的方法,我们也可以用如下方式创建字典:

    student={}

    student['id']='10001'

    student['name']='Jack'

    student['gender']='male'

    student['age']=19

    print(student)

    只需要创建一个空的字典,然后再往其中添加字段,就能灵活的创建字典。输出结果相同,由于篇幅有限,不另作展示。

    删除数据

    使用del语句可以删除字典中的字段,如下:

    student={}

    student['id']='10001'

    student['name']='Jack'

    student['gender']='male'

    student['age']=19

    print(student)

    del student['age']

    print(student)

    直接用del后接选中字典键,的方式,就可以删除字段,来看输出结果:

    {'id': '10001', 'name': 'Jack', 'gender': 'male', 'age': 19}

    {'id': '10001', 'name': 'Jack', 'gender': 'male'}

    [Finished in 0.1s]

    对比很明显。

    遍历字典

    前面用大量篇幅介绍过了列表的遍历,即通过for语句和if语句循环输出列表元素。字典的遍历与列表的遍历有相似之处,请看下面:

    student={

    'id':'10001',

    'name':'Jack',

    'gender':'male',

    'class':'1',

    'age':19

    }

    for key,value in student.items():

    print(key+":"+str(value))

    可以看到有两处明显的不同,参数不同和student后面多了一个小尾巴。

    在Python,for语句里的参数可以有两个,无需多言;而字典名后面的items()函数的作用则类似于将字典变成可遍历信息或者取出值参数key参数value分别代表了字典的。值得一提的是,因为age字段的值是int类型,在输出的时候需要进行类型转转换。

    遍历键

    for循环除了可以遍历字典的键值对以外,还可以对字典的键进行单独遍历,通过keys()方法实现:

    student={

    'id':'10001',

    'name':'Jack',

    'gender':'male',

    'class':'1',

    'age':19

    }

    for key in student.keys():

    print('Key:'+key)

    看到,字典名后面的items()方法变为了keys()方法,参数部分只有代指键的参数key,它的输出方式相当于是在完整输出键值对的基础上简化,程序运行结果如下:

    Key:id

    Key:name

    Key:gender

    Key:class

    Key:age

    [Finished in 0.1s]

    只是输出键。当然像下面这样的写法也是允许的:

    student={

    'id':'10001',

    'name':'Jack',

    'gender':'male',

    'class':'1',

    'age':19

    }

    for key in student:

    print('Key:'+key)

    和列表的遍历是一样的,我们所用的keys()方法其实是Python在遍历字典中的默认方法,但是仍然强烈建议加上keys()方法,这样程序有更好的可读性。

    keys()

    继续来了解一下keys()的具体含义,我们可以直接打印出keys()方法,如下:

    print(student.keys())

    看看结果:

    dict_keys(['id', 'name', 'gender', 'class', 'age'])

    [Finished in 0.1s]

    很明显,可以看出这是一个由字典的键所组成的列表,每一次的for循环就是在这里面进行取值。

    items()

    同样的,我们也可以对前面所讲的items()方法进行打印输出:

    print(student.items())

    程序运行结果如下:

    dict_items([('id', '10001'), ('name', 'Jack'), ('gender', 'male'), ('class', '1'), ('age', 19)])

    [Finished in 0.1s]

    比上面的稍微复杂,列表里面包含了键值对构成的元组。在用for循环遍历时,就是在这里面取出一个个键值对,两个参数分别对应键和值。

    遍历值

    和keys()方法一样,对应取值的方法有values()方法,如下:

    print(student.values())

    只需要在字典名后面加上values()方法,看看输出结果:

    dict_values(['10001', 'Jack', 'male', '1', 19])

    [Finished in 0.1s]

    只取到值的部分。

    有同学就会问了,如果字典中的值出现重复(键当然不会)怎么办呢,请看下例:

    student={

    'id':'10001',

    'name':'male',

    'gender':'male',

    'class':'1',

    'age':19

    }

    print(student.values())

    将名字修改为“male”,和性别一样(别问我为什么有这样的名字),然后再来看看输出结果是怎样的:

    dict_values(['10001', 'male', 'male', '1', 19])

    [Finished in 0.2s]

    列表中出现了重复值,显然不符合我们的要求。

    通过set()方法就可以去除重复值,set就是集合,它不允许重复值,修改后的代码如下:

    student={

    'id':'10001',

    'name':'male',

    'gender':'male',

    'class':'1',

    'age':19

    }

    print(set(student.values()))

    print(type(set(student.values())))

    看到这么多括号先不用害怕,一层一层剥开它的芯,你会发现,你会讶异,你会鼻酸,你会流泪(谁在边上切洋葱啊喂),我们只是在原有基础上增加set()函数,它会把values()方法得到的列表变为set集合,达到去除重复值的目的,看看输出结果:

    {'10001', 'male', 19, '1'}

    [Finished in 0.1s]

    先看下面那行,说明它已经被转换成了set集合,它的格式在上面,也是用大括号包裹,里面的“male”重复值已经被去除了。

    字典的嵌套

    程序中会遇到的不只有单纯的某一结构,更多时候是以复杂的嵌套方式出现。

    字典列表

    字典列表就是由字典充当列表元素组成的列表,比如某个班级的学生信息:

    student1={

    'id':'10001',

    'name':'Jack',

    'gender':'male',

    'class':'1',

    'age':19

    }

    student2={

    'id':'10002',

    'name':'Lucy',

    'gender':'female',

    'class':'1',

    'age':20

    }

    student3={

    'id':'10003',

    'name':'Tom',

    'gender':'male',

    'class':'1',

    'age':20

    }

    students=[student1,student2,student3]

    print(students)

    将三个学生的信息放入students列表里,就构成了字典列表,输出结果如下:

    [{'id': '10001', 'name': 'Jack', 'gender': 'male', 'class': '1', 'age': 19}, {'id': '10002', 'name': 'Lucy', 'gender': 'female', 'class': '1', 'age': 20}, {'id': '10003', 'name': 'Tom', 'gender': 'male', 'class': '1', 'age': 20}]

    [Finished in 0.1s]

    这样看起来不太方便,我们可以对列表再进行遍历:

    for student in students:

    print(student)

    像这样输出看起来会美观许多:

    {'id': '10001', 'name': 'Jack', 'gender': 'male', 'class': '1', 'age': 19}

    {'id': '10002', 'name': 'Lucy', 'gender': 'female', 'class': '1', 'age': 20}

    {'id': '10003', 'name': 'Tom', 'gender': 'male', 'class': '1', 'age': 20}

    [Finished in 0.1s]

    列表元素是字典。

    在字典中嵌套列表

    这是一种更为复杂的情况,比如我们想在学生信息中新增一条info字段用来存储该学生的身高体重,代码如下:

    student1={

    'id':'10001',

    'name':'Jack',

    'gender':'male',

    'class':'1',

    'age':19,

    'info':['1.73m','60kg']

    }

    student2={

    'id':'10002',

    'name':'Lucy',

    'gender':'female',

    'class':'1',

    'age':20,

    'info':['1.65m','52kg']

    }

    student3={

    'id':'10003',

    'name':'Tom',

    'gender':'male',

    'class':'1',

    'age':20,

    'info':['1.90m','70kg']

    }

    students=[student1,student2,student3]

    for student in students:

    print(student)

    print('Height: '+student['info'][0])

    print('Weight: '+student['info'][1])

    print('---------------------------')

    除了新增“info”以外,在for循环中,我们增加了对“info”里的元素的单独输出,程序运行结果如下:

    {'id': '10001', 'name': 'Jack', 'gender': 'male', 'class': '1', 'age': 19, 'info': ['1.73m', '60kg']}

    Height: 1.73m

    Weight: 60kg

    ---------------------------

    {'id': '10002', 'name': 'Lucy', 'gender': 'female', 'class': '1', 'age': 20, 'info': ['1.65m', '52kg']}

    Height: 1.65m

    Weight: 52kg

    ---------------------------

    {'id': '10003', 'name': 'Tom', 'gender': 'male', 'class': '1', 'age': 20, 'info': ['1.90m', '70kg']}

    Height: 1.90m

    Weight: 70kg

    ---------------------------

    [Finished in 0.1s]

    重点在于单独取出“info”的部分,for循环先取出一条student信息,然后选中键值“info”,再通过[0]定位到嵌套列表的第一个元素“height”,通过[1]定位到嵌套列表的第二个元素“weight”,这样就可以单独输出info了。

    在字典中嵌套字典

    字典中既然可以嵌套列表,当然也能够嵌套字典了。但这样做想想就很复杂,一般较少使用,比如下例:

    phones={

    'iPhone X':{

    'capacity':'64G',

    'price':'RMB 8316'

    },

    'iPhone 8':{

    'capacity':'64G',

    'price':'RMB 5837'

    }

    }

    for name,info in phones.items():

    print(name)

    print(info)

    print('-------------------------')

    以苹果手机为例,字典包含名字和基本信息,输出结果如下:

    iPhone X

    {'capacity': '64G', 'price': 'RMB 8316'}

    -------------------------

    iPhone 8

    {'capacity': '64G', 'price': 'RMB 5837'}

    -------------------------

    [Finished in 0.1s]

    因为这种类型的嵌套比较少接触到,了解即可。

    小结

    呐呐,还记得上一节末我们的总结小诗吗,那可是花重金请来的御用湿人,今天再一次请到了这位湿人为我们赋诗一首:

    这是诗

            by Tao_皮鼓

    玫瑰是红的,

    我的心是蓝的。

    字典是成对的键值,

    上一次我已经讲过。

    除了增删改查,

    还可以,

    和列表进行嵌套。

    除了用print,

    还可以,遍历,

    用for和if语句灵性输出。

    待到一撃男更新时,

    就是我们见面日。

    okok,今天的内容就讲完了,下一章,我们会学习while语句,并且通过用户输入实现和程序的交互。

    你可以扫描下方二维码找到我哦:

    编程文科僧

    相关文章

      网友评论

          本文标题:15天Python入门 Day 06:字典

          本文链接:https://www.haomeiwen.com/subject/jivmbftx.html