什么是字典?什么是集合?
字典定义
字典是由一系列键(key)值(value)对组成的元素的容器,其中,字典的key只能是不可变数据类型(字符串,整型,浮点型,元组,布尔,字典)value可以是任意的数据类型。
字典是可变的数据类型,其长度大小可变,可以任意增加、删除或者修改内部的元素
字典不支持索引操作
创建字典的5种方式
第一种:创建的同时添加键值对
dict1 = {
'name':'jack','age':18'}
第二种:先创建一个空字典,然后往里面添加键值对
dict2 = {
}
dict2['name'] = 'jack'
第三种:dict3 = dict(变量1=值1,变量2=值2,…)
dict3 = dict(name = 'jack',age = 18)
缺点:只有字符串可以作为key
第四种:dict4 = dict([(key1,value1),key2,value2),…]
dict4 = dict([('name','jack'),('age',18)])
第五种:dict5 = dict(zip([所有key],[所有value])
dict5 = dict(zip(['name','age','gender'],['jack',18]))
当key和value的数量不相等时,以数量少的最为参考
添加元素
dict[key] = value
这种方式适用于key不存在的情况下,key存在会被覆盖
dict6 = {
'name':'jack','age':18}
dict6['gender'] = 'male'
update()
更新,合并字典,将制定字典中的键值对添加到原字典中
dict7 = {
'name':'jack','age':18}
dict8 = {
'gender':'male'}
dict7.update(dict8)
删除元素
pop(key,default)
根据指定的key删除键值对,返回被删除的value,可以设置默认值,key不存在时返回默认值
dict7 = {
'name':'jack','age':18}
dict7.pop('age',None)
Out[3]: 18
# key不存在
dict7 = {
'name':'jack','age':18}
dict7.pop('gender','null')
Out[9]: 'null'
clear()
清空字典内所有的键值对
dict7 = {
'name':'jack','age':18}
dict7.clear()
dict7
Out[12]: {
}
del
del 字典:删除字典
del 字典[key]:删除键值对
dict7 = {
'name':'jack','age':18}
del dict7['name']
dict7
Out[15]: {
'age': 18}
del dict7
dict7
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3267, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-17-a5c19ca6b14a>", line 1, in <module>
dict7
NameError: name 'dict7' is not defined
修改元素
字典[key] = value
dict7 = {
'name':'jack','age':18}
dict7['name'] = '克莱汤普森'
dict7
Out[20]: {
'name': '克莱汤普森', 'age': 18}
查
len()
获取字典中键值对的个数
dict7
Out[21]: {
'name': '克莱汤普森', 'age': 18}
len(dict7)
Out[22]: 2
get()
字典[key]这样访问键值对的方式,在key不存在的情况下会抛出异常,get(key,default)在key不存在且设置默认之的情况下不会报错,而是返回默认值,如果没有设置默认值则返回None
dict7
Out[23]: {
'name': '克莱汤普森', 'age': 18}
dict7['gender']
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3267, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-24-88f3c9918f9f>", line 1, in <module>
dict7['gender']
KeyError: 'gender'
dict7.get('gender','null')
Out[25]: 'null'
dict7.get('name')
Out[26]: '克莱汤普森'
集合的定义
集合不支持索引操作,集合本身是无序的,和列表、元组、字符串不一样
集合中的元素都是不重复的
对集合使用索引会报错
空集合用set()表示
s = {
1,2,3}
s[0]
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3267, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-28-c9c96910e542>", line 1, in <module>
s[0]
TypeError: 'set' object does not support indexing
如果需要对集合中的元素排序,可以使用sorted(set),返回的是一个排好序的列表
s = {
30,23,11}
s_list = sorted(s)
s_list
Out[32]: [11, 23, 30]
集合中元素的增、删、改、查
增
set.add(value)
将元素添加到集合的过程中,如果该元素已存在,则不进行添加操作
s
Out[33]: {
11, 23, 30}
s.add(35)
s
Out[35]: {
11, 23, 30, 35}
删
pop()
因为集合是随机的,pop()是删除最后一位的元素,所以每次删除都不确定要删除的元素,要谨慎使用
s
Out[39]: {
11, 23, 30}
s.pop()
Out[40]: 11
s
Out[41]: {
23, 30}
remove(value)
删除指定的元素,如果元素不存在会抛出异常
s = {
30,11,23,35,2}
s.remove(2)
s
Out[44]: {
11, 23, 30, 35}
s.remove(10)
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3267, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-45-23b5f1bb77c8>", line 1, in <module>
s.remove(10)
KeyError: 10
discard()
discard()和remove()功能相同,但当元素不存在时不会报错,集合在删除元素时建议使用discard()
s = {
30,11,23,35,2}
s.discard(10)
s
Out[48]: {
2, 11, 23, 30, 35}
update(seq)
将一个可迭代对象中的元素添加到集合中,可迭代对象:字符串(str),列表(list),元组(tuple),字典(dict)…
s1 = [13,77,34]
s.update(s1)
s
Out[51]: {
2, 11, 13, 23, 30, 34, 35, 77}
总结:字典和集合的基本操作以及两者各自的特性,比如集合中元素的不可重复性、字典中的key必须时不可变数据类型等等。字典和集合在python中性能极高的两种数据结构,两者在查找、添加(插入)、删除操作上的效率比起列表要好很多,在编写代码的时候选择合适的数据结构,代码的运行速度会有很大的提高。