前言
上篇文章python学习——【第五弹】中我们了解了python中的不可变序列元组,这篇文章接着介绍可变序列字典和集合。
字典
字典的实现原理: 字典,顾名思义其实现原理和字典类似,字典中的元素都是key—value,以键值对的方式存储数据,因此python中的字典可以根据key来查找value的位置。并且字典中的key是唯一的,不允许重复,但value是可以重复的。
字典的特点:
1:字典是python的内置数据结构之一,是可变序列,并且可以任意嵌套,在原处的增删改等操作不会影响其id地址
2:字典属于无序序列,其每一项都是从左到右随机排序的,即保存在字典中的项是没有固定顺序的,因此无法在字典中指定位置插入元素
3:字典中的key必须是不可变对象,如字符串,元组,数值
4:字典也可以根据需要进行动态伸缩,但会浪费较大的内存,是一种空间换时间的数据结构
创建方式
1:创建字典最常用的方式就是使用花括号:dict_name = {'key_1': 'value_1', 'key_2': 'value_2'}
2:使用内置函数dict(): dict_name = dict('key_1'='value_1', 'key_2'='value_2')
使用花括号创建字典:
scores={'join':100,'lisa':102,'tom':99} #不使用内置函数dict()创建字典时,如果使用字符串作为键,需要在字符串两端加引号
print(scores,type(scores))
#{'join': 100, 'lisa': 102, 'tom': 99} <class 'dict'>
使用内置函数dict()创建字典:
scores1=dict(name='tom',age=20) #使用内置函数创建字典时,若字符串作为键,不可在两端加引号。
print(scores1,type(scores1))
#{'name': 'tom', 'age': 20} <class 'dict'>
![python学习——【第六弹】 python学习——【第六弹】](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzLzIwMjMwMi83NDI3YzYyOTljMGFjMzliNzQyNzMzMWM2ZTUyN2ZjZmRkMTczMy5wbmc%3D.png?w=700&webp=1)
空字典的创建:
list1=[1,2,3,4]
dict1={}
dict2=dict()
dict3=dict.fromkeys(list1)
#使用fromkeys()函数需要传入一个列表,使其中元素作为新字典的键,由于没有传值,因此字典值为空。
print(dict1,type(dict1),dict1.values())#{} <class 'dict'> dict_values([])
print(dict2,type(dict2))#{} <class 'dict'>
print(dict3,type(dict3),dict3.values())#{1: None, 2: None, 3: None, 4: None} <class 'dict'> dict_values([None, None, None, None])
any()可以检查字典的值是否为空,为空返回False
print(any(dict1.values()))# False
print(any(dict3.values()))# False
使用元组和列表创建字典:
yuanzu=(11,'aa',22,'bb')
list1=['cc',33,'dd',55]
new_dict={yuanzu:list1}
print('元组和列表创建字典:', new_dict,type(new_dict))
#元组和列表创建字典: {(11, 'aa', 22, 'bb'): ['cc', 33, 'dd', 55]} <class 'dict'>
注意要将元组作为键,列表作为值才能创建字典;若将列表作为键,元组作为值会抛出TypeError的错误
如果想让两个列表创建字典,需要借助zip()函数
使用zip()函数:
items = ['aiai', 'lili', 'nini']
prices = [10, 20, 30]
d = {item: price for item, price in zip(items, prices)}
print(d, type(d)) # {'aiai': 10, 'lili': 20, 'nini': 30} <class 'dict'>
c = {item.upper(): price for item, price in zip(items, prices)}
print(c, type(c)) # {'AIAI': 10, 'LILI': 20, 'NINI': 30} <class 'dict'>
或者是直接使用新生成的zip对象生成字典
zip( ) 函数的第一个参数形成了字典中的键 (key),第二个参数形成了字典中的值 (value)。若zip( )中两列表长度不相同,则返回对象与最短列表的长度相同
list1=[1, 2, 3, 4]
list2=['a', 'b', 'c', 'd','p']
new_list=zip(list1, list2)#将list1和list2拼接后转换成zip对象
dictionary=dict(new_list)#将zip对象转换成字典
print(dictionary, type(dictionary)) # {1: 'a', 2: 'b', 3: 'c', 4: 'd'} <class 'dict'>
字典元素获取方式
1: []方法 举例: dict_name['key']
2: get()方法 举例 dict_name.get('key')
两者取值的区别:
[]方法:如果字典中不存在指定的key, 抛出keyError异常
get()方法:如果字典中不存在指定的key, 不会抛出keyError的异常,而是返回None,并且可以通过参数设置默认的value,以便指定的key不存在时返回。
scores={'join':100,'lisa':102,'tom':99}
# print('scores中的om:',scores['om']) # scores['om'] 输出 KeyError: 'om'
print('scores中的tom:',scores['tom']) #scores中的tom: 99
print('scores中的susan:',scores.get('susan')) # None
print('scores中不存在的元素:',scores.get('lili',99)) #输出99 在字典中所在位置查找的元素不存在时默认输出指定位置的索引
字典中的key
key的判断 in --》'kay' in dict_name ---》 指定的key在字典中返回True,不存在返回False
not in ---》'kay' not in dict_name --》指定的key在字典中不存在返回True,存在返回False
dire1={'lili':1,'kaka':23,'lala':99,'didi':10}
print('lili' in dire1) #True
print('lili' not in dire1) #False
获取字典中的键、值
dire1={'lili':10,'lisa':11,'kaka':12}
key1=dire1.keys()
print(key1) #dict_keys(['lili', 'lisa', 'kaka'])
print(type(key1)) # <class 'dict_keys'>
print(list(key1)) #将所有的key组成的视图转成列表 ['lili', 'lisa', 'kaka']
print(tuple(key1)) #将所有的key组成的视图转成元组 ('lili', 'lisa', 'kaka')
print(set(key1))#将所有的key组成的视图转成集合 {'lili', 'kaka', 'lisa'}
#获取所有的value
dire1={'lili':10,'lisa':11,'kaka':12}
value1=dire1.values()
print(value1) #dict_values([10, 11, 12])
print(type(value1)) #<class 'dict_values'>
print(list(value1)) #将所有的value值组成的视图转换成列表[10, 11, 12]
print(tuple(value1)) #将所有的value值组成的视图转换成元组(10, 11, 12)
print(set(value1)) #将所有的value值组成的视图转换成集合{10, 11, 12}
# 获取所有的key-value对
dire1={'lili':10,'lisa':11,'kaka':12}
items=dire1.items()
print(items) #dict_items([('lili', 10), ('lisa', 11), ('kaka', 12)])
print(list(items)) #[('lili', 10), ('lisa', 11), ('kaka', 12)] 转换之后的列表元素是由元组组成的
# 根据相同的值来获取不同的键
dicts={'Math':100,'Chinese':100,'Engish':90}
keys=[k for k,v in dicts.items() if v==100]
print('值为100的键有:',keys) #值为100的键有: ['Math', 'Chinese']
字典元素的遍历
使用键值对遍历
dire1={'lili':11,'lala':22,'caca':23}
for item in dire1.items():
print(item)
'''
('lili', 11)
('lala', 22)
('caca', 23)
'''
dire1={'lili':11,'lala':22,'caca':23}
for key,value in dire1.items():
print(key,"的年龄是:",value)
'''
lili 的年龄是: 11
lala 的年龄是: 22
caca 的年龄是: 23
'''
遍历字典的键:
dire1={'lili':11,'lala':22,'caca':23}
for keys in dire1.keys():
print(keys)
'''
lili
lala
caca
'''
遍历字典的值:
dire1={'lili':11,'lala':22,'caca':23}
for values in dire1.values():
print(values)
'''
11
22
23
'''
向字典中增加元素
dire2={'cici':12,'dodo':13,'cici':11,'qiqi':10}
print('新增前dire2的字典:',dire2,id(dire2)) #增加前dire2的字典: {'cici': 11, 'dodo': 13, 'qiqi': 10} 140215317019616
dire2['kiki']=20 #默认再字典元素末尾新增一个元素
print('新增元素后的字典:',dire2,id(dire2)) #增加元素后的字典: {'cici': 11, 'dodo': 13, 'qiqi': 10, 'kiki': 20} 140215317019616
给字典删除元素
dire1={'lili':1,'kaka':23,'lala':99,'didi':10}
print('删除前dire1字典:',dire1,id(dire1)) #删除前dire1字典: {'lili': 1, 'kaka': 23, 'lala': 99, 'didi': 10} 140215317019536
del dire1['lili']
print('删除指定元素后的dire1字典:',dire1,id(dire1))#删除指定元素后的dire1字典: {'kaka': 23, 'lala': 99, 'didi': 10} 140215317019536
修改字典中的元素
# 修改字典相应键的值
dire2={'cici':12,'dodo':13,'cici':11,'qiqi':10}
dire2['cici']=55
print('修改值后的字典:',dire2) #修改值后的字典: {'cici': 55, 'dodo': 13, 'qiqi': 10, 'kiki': 20}
集合
1: 集合是python语言提供的内置数据结构,具有无序性(集合中的元素无法通过索引下标访问,并且 每次输出时元素的排序顺序可能都不相同。),互异性,确定性。
2 :与列表、字典一样都属于可变类型的序列;但集合中的元素是不能重复的,因此可以利用集合为一组数据去重。
3: 集合是没有value的字典
创建方式
1:可以直接使用花括号创建; set_name={11,22,'hello','world'}
2:使用内置函数set()创建:set_name=((11,22,'hello','world'))
jihe={11,22,33,44}
print(jihe,type(jihe),id(jihe))
# {33, 11, 44, 22} <class 'set'> 140157225363408
jihe2=set(('hello','world',11)) #注意是双括号
print(jihe2,type(jihe2),id(jihe2))
# {'hello', 11, 'world'} <class 'set'> 140157225362928
set1 = set("hello,world")
set2 = set([1, 2, 3, 4, 5])
set3 = set((1, 2, 3, 4, 5))
set4 = set(range(1, 9))
print(set1) #{'o', 'd', 'e', 'r', ',', 'w', 'h', 'l'}
print(set2) #{1, 2, 3, 4, 5}
print(set3) #{1, 2, 3, 4, 5}
print(set4) #{1, 2, 3, 4, 5, 6, 7, 8}
字典转set集合,需要注意的是,只取了字典的key,相当于将字典中的dict.keys()列表转成set集合。
jihe4=set({'a':2,'b':3,'c':4})
print(jihe4)
# {'c', 'a', 'b'}
空集合的创建:
如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {},Python 解释器会将其视为一个空字典。
s=set()
print(s,type(s),id(s))
# set() <class 'set'> 140549035954496
s1=set([])#列表
print(s1,type(s1),id(s1))
# set() <class 'set'> 140549035954736
s2=set(())#元组
print(s2,type(s2),id(s2))
# set() <class 'set'> 140549035954976
s3=set({})#字典
print(s3,type(s3),id(s3))
# t() <class 'set'> 140549035955456
访问集合中的元素
由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来,或者使用 in 关键字查询集合中是否存在指定值。
sets= {11,'c',1,(1,2,3),'hello'}
for setss in sets:
print(setss,end=' ')
#1 11 (1, 2, 3) c hello
删除集合元素
使用 remove() 方法,语法格式如下:set_name.remove(element)
set1 = {11, 'hello', 1, (1, 2, 3), 'world', 'aa'}
set1.remove(11)
print(set1)
# {1, 'hello', 'world', (1, 2, 3), 'aa'}
如果删除的元素不再集合内,则会抛出 KeyError 错误
![python学习——【第六弹】 python学习——【第六弹】](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzLzIwMjMwMi85OTQxMmIyOTE3YjJmYWIyZjVlNDc2NDQxZmZmYjc0YjU0OGQzOC5wbmc%3D.png?w=700&webp=1)
也可以使用 discard() 方法,该方法和 remove() 方法的用法完全相同,唯一的区别就是,当删除集合中元素失败时,不会抛出任何错误,但会返回原集合。
![python学习——【第六弹】 python学习——【第六弹】](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzLzIwMjMwMi81MzdlMzRkOTczMjYyY2Y3MTA1ODIxOGFmNzAwNTFkYzYyMWNmOS5wbmc%3D.png?w=700&webp=1)
使用pop()函数随机移除集合中的一个元素
x = {"apple", "banana", "cherry"}
set.pop(x)
print(x)
# {'apple', 'cherry'}
删除集合
可以通过del()关键字删除整个集合对象
set1 = {11, 'hello', 1, (1, 2, 3), 'world', 'aa'}
print(set1)
del set1
print(set1)
# NameError: name 'set1' is not defined
向集合中添加元素
可使用set类型提供的 add() 方法实现,add() 方法添加的元素,只能是数字、字符串、元组等不可变类型或者布尔类型,不能添加列表、字典、集合等可变的数据,否则Python解释器会抛出TypeError错误。如果该元素已存在,则 add() 方法就不会添加元素
set2= {1, 2, 3}
print('添加元素之前集合的信息:',set2,type(set2),id(set2))
# {1, 2, 3} <class 'set'> 140033352959952
set2.add((1, 2))
print('添加元素后集合的信息:',set2,type(set2),id(set2))
# 添加元素后集合的信息: {(1, 2), 1, 2, 3} <class 'set'> 140033352959952
![python学习——【第六弹】 python学习——【第六弹】](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzLzIwMjMwMi9hMjFjMTljNjMyMTljZTZhM2E1OTcwZTY0MTViNmEyNDg4ZTVhZi5wbmc%3D.png?w=700&webp=1)
使用update()函数向当前的集合中添加集合
x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
x.update(y)
print(x)
# {'cherry', 'runoob', 'banana', 'apple', 'google'}
集合的运算
操作名称
|
操作符
|
含义
|
举例
|
交集
|
+
|
取两集合的公共元素
|
set1={1,2,3} set2={3,4,5} print(set1&set2) #3 |
并集
|
|
|
取两集合全部集合
|
set1={1,2,3} set2={3,4,5} print(set1|set2) #{1, 2, 3, 4, 5} |
差集
|
-
|
取一个集合中含有的另一个集合没有的元素
|
set1={1,2,3} set2={3,4,5} print(set1-set2) #{1, 2} print(set2-set1) #{4, 5} |
对称差集
|
^
|
取两集合中不属于两集合交集的元素
|
set1={1,2,3} set2={3,4,5} print(set1^set2) #{1, 2, 4, 5} |
每篇一语
工欲善其事,必先利其器!
到此对于python中的序列就介绍完了,接下来还会持续更新python学习——【第N弹】!回顾请点击这里:点我点我
如有不足,感谢指正!