那么好,终于也是来到了初识python----数据类型的最后一期,在本期中,我们一起来学习最后一类数据类型——散列类型,温馨提示:本期内容较多,有需要的小伙伴请耐心观看
三、散列类型
首先,什么是散列类型?不同于序列类型,散列类型是无序的,内部元素是不重复的,并且是没有下标的,其次,散列类型主要分为字典(dict)和 集合(set),下面,我们来对其一一进行学习
3.1 字典
在开始学习字典之前,先介绍一下什么是键值,类似与生活中根据拼音查找某个汉字,这里的拼音就是键(key),而查找到的汉字就是值(value),字典也就是可以根据键快速的查找到想要的值,最后介绍一下字典的表现形式:{key:value} ,其中存储的值被我们成为键值对,而这样存储数据的方式就被称为字典。下面,我们一起来创建一份字典
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
这样,我们就成功创建了一份保存联系人与电话号码的字典,那么,我们又该怎样获取联系人对应的电话号码呢?这就要提到字典的输出方式了:字典名[键]
例:取出联系人Bob对应的电话号码
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
print(Phone_Number['Bob'])
#输出结果
123789
从这个例子可以看出,因为键:Bob 对应的值为 123789 ,因此打印结果就为就为123789,通过这个简单的例子,我想你应该学会了如何取出字典键对应的值,下面,我们接着学习字典的常用操作
3.1.1 常用操作
3.1.1.1 通过键(key)访问到对应的值(value)
该方法开始已经介绍过,在这里不作过多赘述,直接看例子
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
print(Phone_Number['Bob'])
#输出结果
123789
3.1.1.2 通过键(key)添加键值对(key-value)
如果想要为字典添加键值对,就只需为不存在的键赋值即可
例:新添加联系人Jane,其号码为156798
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
Phone_Number['Jane'] = 156798
print(Phone_Number)
#输出结果
{'Mike':123456,'Bob':123789,'Henry':456789,'Jane':156798}
这样,我们就成功添加了新联系人Jane和其电话号码
3.1.1.3 通过键(key)删除键值对(key-value)
语法:
del 字典名[需要删除键值对的键(key)]
例:删除联系人Henry的联系方式
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
del Phone_Number['henry']
print(Phone_Number)
#输出结果
{'Mike':123456,'Bob':123789}
这样,我们就成功删除了Henry的联系方式
3.1.1.4 通过键(key)修改键值对(key-value)
如果对原有键值对赋值,那么新赋的值就会覆盖原来的值
语法:
字典名[需要修改键值对的键(key)] = 需要修改的值
例:将Mike的电话号码更新为134567
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
Phone_Nmber['Mike'] = 134567
print(Phone_Number)
#输出结果
{'Mike':134567,'Bob':123789,'Henry':456789}
这样,我们就成功更新了Mike的电话号码
3.1.1.5 通过键(key)判断指定键值对(key-value)是否存在
该操作通过使用 in 或者 not in 来实现,并且得到一个布尔值
例:判断Bob 和 May 的电话号码是否都在Phone_Number 内
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
print('Bob' in Phone_Number)
print('may' in Phone_Number)
print('Bob' not in Phone_Number)
print('May' not in Phone_Number)
#输出结果
True
False
False
True
注意:上述操作均是基于键(key)来完成的,小伙伴们在自己练习时可千万别弄错了
另外,字典的键(key)可以是任意的不可变类型,并且,字典的键(key)是不可以重复的,如果出现重复,就默认取最后一个重复键的值,具体来看一下下面的这个例子
dict1 = {'a':1,'b':2,'c':3,'b':4,'b':6}
print(dict1)
#输出结果
{'a': 1, 'b': 6, 'c': 3}
可以看出,b对应右三个值2,4,6,而最后输出时,默认取的是最后一个值,也就是6
好,介绍完了字典的常用操作方法后,我们再来认识一下其常用的方法
3.1.2 常用方法
3.1.2.1 ciear() 方法
该方法用于清空字典的所有键值对(key-value)
语法:
字典名.clear()
例:清空字典Phone_Number
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
Phone_Number.clear()
print(Phone_Number)
#输出结果
{}
这样,就成功清空了字典Phone_number,从而使其变成了一个空字典,因而打印结果为一个大括号{}
3.1.2.2 get() 方法
该方法根据键(key)获取值,不同于直接通过键获取值,通过该方法获取值时,若键(key)不存在,则返会None,而直接通过键获取值时,若键不存在,就会报错
例:使用get() 方法获取Phone_Number中,Henry对应的电话号码,并且,通过get() 方法以及直接通过键获取不存在的键May
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
print(Phone_Number.get('Henry'))
print(Phone_Number.get('May'))
print(Phone_Number['May'])
#输出结果
456789
None
#报错信息
KeyError: 'May'
可以看出,通过键直接获取值时,编译器会出现报错信息,因为该键不存在,所以出现keyError
3.1.2.3 update() 方法
该方法可以使用一个字典所包含的键值对来更新已有的字典,在执行该方法时,若被更新的字典中已经包含了对应的键值对,那么原来的值就会被覆盖,若被更新的字典中不包含对应的键值对,那么热键值对就会被添加进去
语法:
字典名.update(包含更新内容的字典)
例:只操作一次将May:145678,Jane:134567添加到Phone_Number中
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
Phone_Number.update({'May':145678,'Jane':134567})
print(Phone_Number)
#输出结果
{'Mike': 123456, 'Bob': 123789, 'Henry': 456789, 'May': 145678, 'Jane': 134567}
这样,我们就通过一次操作成功的更新了字典Phone_Number
3.1.2.4 items()方法
语法:
字典名.items()
该方法可以的到字典中的所有键值对,并返回一个dict_items对象,该对象可以被转换为列表(类型转换在后面几期中将会介绍,不明白的小伙伴也无需着急)
例:获取字典Phone_Number中的所有键值对,并将其转换为列表
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
A = Phone_Number.items() #使用一个变量去接收dic_items对象
print(A)
print(list(A)) # 完成类型转换,并输出
#输出结果
dict_items([('Mike', 123456), ('Bob', 123789), ('Henry', 456789)])
[('Mike', 123456), ('Bob', 123789), ('Henry', 456789)]
可以看出,经过item()方法以及类型转换后,字典Phone_Number最终被转换为了一份列表
3.1.2.5 keys()方法
语法:
字典名.keys()
该方法可以的到所有的键,并返回一个dict_keys对象,同样也可转为一份列表
例:获取字典Phone_Number的所有键,并转换为列表
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
A = Phone_Number.keys() #使用一个变量去接收dic_keys对象
print(A)
print(list(A)) # 完成类型转换,并输出
#输出结果
dict_keys(['Mike', 'Bob', 'Henry'])
['Mike', 'Bob', 'Henry']
可以看出,通过keys()方法以及类型转换后,最终以列表的形式打印出了字典Phone_Number的所有键
3.1.2.6 values()方法
语法:
字典名.values()
该方法可以得到字典的所有值,并返回一个dict_values对象
例:获取字典Phone_Number的所有值,并以列表的形式输出
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
A = Phone_Number.values() #使用一个变量去接收dic_values对象
print(A)
print(list(A)) # 完成类型转换,并输出
#输出结果
dict_values([123456, 123789, 456789])
[123456, 123789, 456789]
可以看出,经过values()方法以及类型装换后,最终以列表的形式输出了字典Phone_Number的所有值
3.1.2.7 pop() 方法
该方法用于获取指定的键(key)对应的值(value),并且删除这个键值对
例:获取字典Phone_Number中Mike对应的电话号码,并删除这个键值对
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
print(Phone_Number.pop('Mike'))
print(Phone_Number)
#输出结果
123456
{'Bob': 123789, 'Henry': 456789}
可以看出,该方法获取指定键对应的值后便会删除整个键值对
3.1.2.8 setdefault() 方法
该方法根据键获取值,但不同与get()方法以及通过键直接获取值,当要获取的·键在字典中不存在时,该方法会为这个不存在的键设置一个默认的值,然后返回键对应的值
语法:
字典名.setdefault(新增的键(key),新增的值(value))
例:为字典Phone_Number新增键值对 Mary:145678
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
Phone_Number.setdefault('May',145678)
print(Phone_Number)
#输出结果
{'Mike': 123456, 'Bob': 123789, 'Henry': 456789, 'May': 145678}
这样,就成功的为字典Phone_Number添加了新的键值对
另外,如果新增加内容的键值对存在,那么该方法就不会修改字典中的内容
例:为字典Phone_Number新增键值对Bob:134678
Phone_Number = {'Mike':123456,'Bob':123789,'Henry':456789}
Phone_Number.setdefault('Bob',134678)
print(Phone_Number)
#输出结果
{'Mike': 123456, 'Bob': 123789, 'Henry': 456789}
可以看出,字典中的键值对Bob:123789并没有被setdefault()方法修改
学习完了字典的所有内容,接下来让我们一起开启集合的学习
3.2 集合
首先,集合是用来保存不重复的元素,也就是说集合中的元素是唯一且互不相同的,这与数学上的集合一致,其次,介绍一下其语法
集合名 = {数据1,数据2,数据3...}
注意:集合只能存储不可变类型,并且重复的数据是不会被添加到集合的内存空间里的
不同与其他空类型的表示,集合的空类型表现形式为 set()
最后,python中的集合主要是用来处理去重问题以及数学关系运算
3.2.1 去重
例:对列表list1 = [1,3,4,6,7,9,5,3,4,3,1,2,4] 进行去重处理,并以列表的形式输出
list1 = [1,3,4,6,7,9,5,3,4,3,1,2,4]
#对list1进行去重处理
A = set(list1) # 去重后的list1被转换为了一个集合
list2 = list(A) # 将集合A重新转换为列表
print(list2)
#输出结果
[1, 2, 3, 4, 5, 6, 7, 9]
可以看出,经过集合处理后,list1中的重复元素最终被去除
3.2.2 数学运算
首先,介绍一下对应的运算符
例:set1 = {1,2,3,4,5},set2 = {4,5,6,7,8},对这两个集合进行交集、并集、差集以及in和not in运算
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2)
print(set1 | set2)
print(set1 - set2)
print(6 in set2)
print(0 in set1)
#输出结果
{4, 5}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3}
True
False
以上便是数学运算的结果
下面,我们来学习集合的常用方法
3.2.3 常用方法
3.2.3.1 增加元素 add()
语法:
集合名.add(需要添加的对象)
注意:该方法为字符串集合添加新元素时是无序的
例:为集合set1 = {'Hello','python'},添加新元素'world'
set1 = {'Hello','python'}
set1.add('world')
print(set1)
#输出结果
{'Hello', 'world', 'python'}
可以看出,当添加新元素时,新元素的位置是无序的
3.2.3.2 删除元素
3.2.3.2.1 pop()方法
语法:
集合名.pop()
该方法只有集合元素是字符串类型并且在电脑cmd窗口运行时才会随机删除元素,在编译器中运行时默认删除第一个元素
例
set2 = {'Hello', 'world', 'python'}
set2.pop()
print(set2)
#编译器中运行结果
{'python', 'world'}
#cmd窗口运行结果
{'Hello','python'}
可以看出,在不同环境下运行得到的结果是不同的,这点大家一定要注意
3.2.3.2.2 remove()方法
语法:
集合名.remove(需要删除的元素)
例:删除集合set2 = {'Hello', 'world', 'python'} 中的'world'
set2 = {'Hello', 'world', 'python'}
set2.remove('world')
print(set2)
#输出结果
{'Hello','python'}
3.2.3.2.3 discard()方法
语法:
字典名.discard
该方法和remove()方法类似,但是当元素不存在时也不会报错,并打印原来的集合
例:
set2 = {'Hello', 'world', 'python'}
set2.discard('AAA')
print(set2)
#输出结果
{'Hello','world','python'} # 不会报错
3.2.3.2.4 clear()方法
该方法可以清空集合中的所有元素
语法:
集合名.clear()
例:清空集合set2 = {'Hello', 'world', 'python'}
set2 = {'Hello', 'world', 'python'}
set2.clear()
print(set2)
#输出结果
set{} # 空集合
可以看出,打印的结果为一个空集合
3.2.3.2.5 del 方法
该方法用于删除集合
语法:
del 集合名
例:删除集合set2 = {'Hello', 'world', 'python'},并打印结果
set2 = {'Hello', 'world', 'python'}
del set2
print(set2)
#输出结果
NameError: name 'set2' is not defined
可以看出,因为set2已经被删除,所以在打印set2的时候就会报错,显示set2未被定义
3.2.3.3 修改元素
修改元素就是直接先删除再添加
例:把集合set2 = {'Hello', 'world', 'python'}中的'world'改为'CCC'
set2 = {'Hello', 'world', 'python'}
set2.remove('world') # 先删除
set2.add('CCC') # 再添加
print(set2)
#输出结果
{'Hello','CCC','python'}
这样,就成功的将'world'改为了'CCC'
3.2.3.4 查找元素
由于集合是一个可迭代对象,因此可以通过for循环进行遍历查询(不明白什么是可迭代对象和for循环的小伙伴也不用着急,这些在后面几期中都会有介绍)
例:查询集合set2 = {'Hello', 'world', 'python'}中的所有元素
set2 = {'Hello', 'world', 'python'}
#for循环进行遍历
for i in set2:
print(i)
#输出结果
Hello
world
python
这样,就成功的查询到了集合set2中的所有元素
总结
一、序列类型与散列类型
序列类型:字符串、列表、元组
散列类型:字典、集合
二、可变类型与不可变类型
可变类型:列表、字典、集合
不可变类型:数字、字符串、元组
三、可变与不可变的概念
可变:值发生改变时,内存地址不变,也就是id不变,证明在改变原来的值
不可变:值发生改变时,内存地址也发生改变,也就是id也改变,证明是没有在改变原来的值,而是产生了新的值
四、序列与散列的区别
序列:相邻有序且定位灵活(索引+切片)
散列:分散无序但定位迅速(键定位)
好了,以上就是初识python----数据类型的所有内容,有需要修改的地方欢迎各位小伙伴指出,
下一期将会是python中的流程控制,感兴趣的小伙伴别错过哦~,我们下期见