Python高手之路体验课 第 14 / 18 篇

数据类型-字典,集合与布尔类型

在阅读本系列课程时,你需要跟着老师代码敲敲,看看代码print 输出结果加深理解。

一 字典

1. 字典类型基本介绍

字典用于存放一个人的信息:姓名,性别,年龄,很明显是多个值,既然是存多个值,我们完全可以基于刚刚学习的列表去存放,如下:

# 既然如此,我们为何还要用字典?
info=['albert','male',18]
# 定义列表的目的不单单是为了存储,还要考虑取值,如果我想取出这个人的年龄,可以用
info[2]
# 但这是基于我们已经知道在第3个位置存放的是年龄的前提下,我们才知道索引2对应的是年龄,即:
#      # name, sex, age
info=['albert','male',18]
"""
而这完全只是一种假设,并没有真正意义上规定第三个位置存放的是年龄,
于是我们需要寻求一种,即可以存放多个任意类型的值,又可以硬性规定值的映射关系的类型,
比如key=value,这就用到了字典
"""

字典用于标识存储多个值的情况,每个值都有唯一一个对应的key,可以更为方便高效地取值,字典的定义格式如下:

# 在{}内用逗号分隔,可以存放多个key:value的值,key一般是字符串,value可以是任意类型
info={'name':'albert','age':18,'sex':18} 
# info=dict({'name':'albert','age':18,'sex':18})

字典可以存储多个值,是无序的,是可变类型,不可哈希。

2. 字典类型常用的方法

(1) 增加元素

通过键值对的方式

l1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male'
}
l1['hobbies'] = "music"
print(l1)

用fromkeys构造一个字典

"""
第一个参数迭代循环的字典的key,第二个参数表示value,
可以多个key循环对应这个value,也可以只有一个key,也可以没有value
"""
a = l1.fromkeys(l1,'I am Albert') 
print(a)

b = dict.fromkeys('name')  # 必须有一个可迭代类型,作为字典的key
print(b)

b = dict.fromkeys('e')  # 也可以迭代
print(b)
# b = dict.fromkeys(1) #报错 数字类型不可迭代

b = dict.fromkeys([1,2,3,])
print(b)

(2) 删除元素

del 通过字典的key删除

l1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male'
}

del l1['name']
print(l1)

pop 或者popitem删除

l1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male'
}

res = l1.pop('name')  # 删除指定key的value,并拿到一个返回值
print(res)
print(l1)

res2 = l1.popitem()  # 随机返回并删除字典中的一对键和值(一般删除末尾对)。
# 如果字典已经为空,却调用了此方法,就报出KeyError异常。
print(res2)
print(l1)

(3) 更改元素

通过键值对的方式

l1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male','3':3,
}

l1['name'] = '马一特'
print(l1)

通过setdefault 或者update操作,两者使用和区别如下:

setdefault只添加不修改

d1 = {
    'name': 'albert',
    'age': 18,
}

d1.setdefault('name', 'Albert')
d1.setdefault('gender', 'male')
print(d1)

update既添加也修改

d1 = {
    'name': 'albert',
    'age': 18,
}

d1.update({'name': 'Albert', 'gender': 'male'})  # 注意传参方式的不同
print(d1)

(4) 查找元素

通过键值对查找

l1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male'
}

a = l1['name']
print(a)

通过get方法查找

l1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male'
}

a = l1.get('hobbies')   # 找不到不报错
print(a)

通过enumerate 枚举

d1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male',
    '3':3,
}

for a in enumerate(d1):
    print(a)

通过.keys(),.values(),.items()等方法

d1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male',
    '3':3,
}

a = d1.keys()
print(a)
print(list(a)[0])

a = d1.values()
print(a)
print(list(a)[0])

a = d1.items()
print(a)
print(list(a)[0])

通过for循环遍历

d1 = {
    'name': 'albert',
    'age': 18,
    'gender': 'male',
    '3':3,
}

for k,v in d1.items():
    print(k,v)

(5) 成员运算与长度运算

参考列表的运算方法,成员运算的依据是字典的key,而不是value,长度运算都可以作为参考的依据

二 集合类型

花括号内,多个元素用逗号分割,用来存储多个值,并且是无序的,那么这多个值不能用来取值,但是我们可以使用它来进行去重(比如去掉列表中重复的元素)和关系运算。

# 集合的元素遵循三个原则:
             1: 每个元素必须是不可变类型(可作为字典的key)
             2: 没有重复的元素
             3: 无序
# 注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值

集合类型可以存多个值,是无序的,是可变类型,不可以哈希。

关系运算练习

有如下两个集合,piano是报名钢琴课程的学员名字集合,violin是报名小提琴课程的学员名字集合
  piano={'albert','孙悟空','周星驰','朱茵','林志玲'}
  violin={'猪八戒','郭德纲','林忆莲','周星驰'}
  1. 求出即报名钢琴又报名小提琴课程的学员名字集合
  2. 求出所有报名的学生名字集合
  3. 求出只报名钢琴课程的学员名字
  4. 求出没有同时这两门课程的学员名字集合

参考答案

# 求出即报名钢琴又报名小提琴课程的学员名字集合
print(piano & violin)
# 求出所有报名的学生名字集合
print(piano | violin)
# 求出只报名钢琴课程的学员名字
print(piano - violin)
# 求出没有同时这两门课程的学员名字集合
print(piano ^ violin)

三 布尔类型

计算机俗称电脑,即我们编写程序让计算机运行时,应该是让计算机无限接近人脑,或者说人脑能干什么,计算机就应该能干什么,人脑的主要作用是数据运行与逻辑运算,此处的布尔类型就模拟人的逻辑运行,即判断一个条件成立时,用True标识,不成立则用False标识。

#布尔值,一个True一个False
>>> a=3
>>> b=5
>>> a > b #不成立就是False,即假
False
>>> a < b #成立就是True, 即真
True
# 接下来就可以根据条件结果来干不同的事情了:
if a > b:
   print(a is bigger than b )
else:
   print(a is smaller than b )
# 上面是伪代码,但意味着,计算机已经可以像人脑一样根据判断结果不同,来执行不同的动作。

布尔类型的重点知识

#所有数据类型都自带布尔值
1、None,0,空(空字符串,空列表,空字典等)三种情况下布尔值为False
2、其余均为真

可变类型与不可变类型(重点)

# 1.可变类型:在id不变的情况下,value可以变,则称为可变类型,如列表,字典
# 2. 不可变类型:value一旦改变,id也改变,则称为不可变类型(id变,意味着创建了新的内存空间)