上一讲提到的列表是有序的可变序列,而这次要提到的字典和集合属于无序的可变列表。

1.字典

字典的创建

字典由“键-值“对组成,在python中,通过如下命令创建一个空字典

# 方法1,使用花括号

a_dict = {}

# 方法2,使用dict()函数

b_dict = dict()

# 查看变量类型

print(type(a_dict), type(b_dict))  # 输出<class 'dict'> <class 'dict'>

在字典中,元素的“值”是以“键”来查询的,这也就是所谓“键:值”,在字典中需要注意:

1. 键必须是唯一的,而不同“键”对应的“值”则可以相同。

2. 键必须是不可变数据类型,值的数据类型不做要求。

例如,创建出一个包含两个键值对的字典如下:

c_dict = {'mary': 'cat', 'jacky': 'dog'}

下面讲一下字典的增删改查操作

要想增加字典中的元素,只需指明需要添加的键和值。如:

a_dict['mary'] = 'cat'

a_dict['jack'] = 'dog'

print(a_dict)  # 输出{'mary': 'cat', 'jack': 'dog'}

同样,想要删除字典中的元素,可以使用del,例如

del a_dict['mary']

修改字典元素,需要指明修改的是哪个键对应的值,进行赋值操作即可覆盖原值获得新的键值对映射关系。

# 'jack'对应的值从'dog'修改为'cat'

a_dict['jack'] = 'cat'

可以使用 in, not in来查询某个元素是否在字典中,需要指明的是,既可以查询键是否在字典中,也可以查询值是否在字典中,但要分别使用到keys()方法和values()方法获取到字典的键、值。例如:

# 查询'jack'是否存在于字典的键中

if 'jack' in a_dict.keys():

    print('yes')

# 查询'dog'是否存在于字典的值中

if 'dog' in a_dict.values():

    print('of course yes')

对字典的理解

发现没有,在字典中“键”的地位其实类似于列表中的索引,通过访问“键”可以取到值,就像访问索引后就能得到列表的值一样。

字典和列表不同指出在于,实现数据结构的底层逻辑不一样,字典是典型的以空间换取时间的数据结构,即字典占用更多的空间,但访问速度很快,字典其实就是一种“散列表”。当然,这些是进阶的内容,此处仅作延伸帮助理解。

遍历字典

与列表相同,字典是可迭代的数据类型,能够与for循环结合使用。

例如:

# region 遍历字典

a_dict = {'mary': 'cat', 'jacky': 'dog'}

for each_key in a_dict.keys():

    print(each_key)

for each_value in a_dict.values():

    print(each_value)

for each_key, each_value in a_dict.items():

    print(each_key, each_value)

# endregion

2. 集合

跟字典相比,集合没有字典中“键”的概念,是数学教材中“集合”的概念相同

创建一个空集合,使用set()函数

例如:

a_set = set()

集合的增删改查操作

集合使用add()方法增加元素。例如:

# 创建一个包含几个值的集合
b_set = {1, 2, 3, 4}
b_set.add(5)
print(b_set)

这里需要注意,非空集合(注意是非空,空集合只能用set()函数)也可以用花括号来创建,但是与字典相比,没有了键值对的映射关系。

删除集合中的某个元素,可以使用remove()或者discard()方法,例如

b_set.remove(5)
b_set.discard(4)
print(b_set)  # 输出{1, 2, 3}

由于集合并不能指明某个固定的元素,因此是无法实现修改某个元素这种操作的

与之前的数据类型一样,可以用in,not in判断元素是否出现在集合中。

集合间的操作

特别地,集合是可以实现求交集,并集,差集的操作的。例如

# region 集合间的操作
c_set = {1, 2, 3, 4, 5}
d_set = {1, 3, 5, 7, 9}
# 求交集
inter_set = c_set & d_set
# 求并集
union_set = c_set | d_set
# 求差集,此处的例子是求c_set中与d_set中不同的所有元素
diff_set = c_set - d_set
print(inter_set, union_set, diff_set)
# endregion