python:字典
一、字典
字典是python中唯一的映射类型。字典中的值并没有特殊的顺序,但是都存储在一个特定的key里。其中key可以是任何一种不可变对象。其中不可变的变量包括数字、元组、字符串。
※可变变量※:字典、列表
那么什么叫不可变?
1 >a=1 #在内存中创建一个区域,放置1这个变量,然后将这个区域的地址指向a
2 >a=2 #当再进行这个赋值时,内存中再创建一个变量2,而不是修改放置1的这个变量为2.此时将放置2的区域的地址指向a。而对于放置1的区域,如果没有指向任何变量时,就会被清除回收。
3
4 #类似于这种机制的对象,就是不可变对象。
那么什么叫可变?
1 >a=['x','y'] #创建一个列表 2 >b=a #将a的值赋值给b,此时a和b指向的是同一个内存块。 3 >b[0]='z' #如果将b[0]的值改变,此时不会重新开辟一个内存块,去指向a,而是直接在此内存块中修改。此时打印a,发现a的值也变成了['z','y'] 4 5 #对于这种各类型的变量,我们称之为可变对象
而,对于value,可是是任何类型的对象。
二、字典的初始化
字典是以[key:value]的形式存在的。key在上面已经说过,用的是不可变对象,value可是是可变对象,也可以是不可变对象
1 >a={1:'a',2:'b',3:'c' } 2 >a={'a':('1','2','3'),'b':('1','2','3','4'),'c':['1','2']} 3 >a={ 4 ('a','b'):{'1','2','3'}, 5 ['a','b']:('a','b') 6 }
※列表和元组的区别:
列表是可以更改的,元组是不可以更改的。
1 >>> list=['a','c'] 2 >>> list[1]='b' #更改列表,并打印 3 >>> list 4 ['a', 'b'] 5 >>> yuanzu=('a','c') 6 >>> yuanzu 7 ('a', 'c') 8 >>> yuanzu[1]='b' #更改元组报错 9 Traceback (most recent call last): 10 File "<pyshell#14>", line 1, in <module> 11 yuanzu[1]='b' 12 TypeError: 'tuple' object does not support item assignment
三、字典增删改查
改编一个字典中的value:
1 >>> dic={'name1':'passwd1','name2':'passwd2','name3':'passwd4'} 2 >>> print(dic) 3 {'name1': 'passwd1', 'name2': 'passwd2', 'name3': 'passwd4'} 4 >>> dic['name3']='passwd3' #改变的方法 5 >>> print(dic) 6 {'name1': 'passwd1', 'name2': 'passwd2', 'name3': 'passwd3'}
删除一个映射
1 >>> dic={'name1':'passwd1','name2':'passwd2','name3':'passwd4'} 2 >>> print(dic) 3 {'name1': 'passwd1', 'name2': 'passwd2', 'name3': 'passwd4'} 4 >>> del dic['name3'] #python中的万能删除方法 5 >>> print(dic) 6 {'name1': 'passwd1', 'name2': 'passwd2'}
字典的方法
复制
1 >>> dic1 2 {'b': 2, 'c': 3, 'a': 1} 3 >>> dic2=dic1.copy() 4 >>> dic2 5 {'b': 2, 'c': 3, 'a': 1}
※字典的copy复制是浅复制,何所谓浅复制——就是只复制第一层。
1 >>> dic1={'a':1,'b':2,'c':3} 2 >>> dic1 3 {'b': 2, 'c': 3, 'a': 1} 4 >>> dic2=dic1.copy() 5 >>> dic2 6 {'b': 2, 'c': 3, 'a': 1} 7 >>> dic2['a']=11 #当你修改这个地方的value是没有问题的 8 >>> dic2 9 {'b': 2, 'c': 3, 'a': 11} 10 >>> dic1 11 {'b': 2, 'c': 3, 'a': 1} 12 13 14 15 >>> dic1={1:['a','b'],2:['c','d']} 16 >>> dic1 17 {1: ['a', 'b'], 2: ['c', 'd']} 18 >>> dic2=dic1.copy() 19 >>> dic2 20 {1: ['a', 'b'], 2: ['c', 'd']} 21 >>> dic2[1][0]='x' #此时如果你修改复制出来的dic2,同时dic1也被更改掉了 22 >>> dic2 23 {1: ['x', 'b'], 2: ['c', 'd']} 24 >>> dic1 25 {1: ['x', 'b'], 2: ['c', 'd']}
※深复制——不光是针对字典,针对所有python中的第二层。这就是python的深拷贝
1 >>>import copy
>>> a=[1,2,3,4,['a','b']] 2 >>> b=copy.deepcopy(a) #而b=copy.copy(a)依然是与[].copy() {}.copy 相同的效果 3 >>> a 4 [1, 2, 3, 4, ['a', 'b']] 5 >>> b 6 [1, 2, 3, 4, ['a', 'b']] 7 >>> a[4][0]='z' 8 >>> a 9 [1, 2, 3, 4, ['z', 'b']] 10 >>> b 11 [1, 2, 3, 4, ['a', 'b']]
清空——clear() 不细说 {}.clear()
1 >>> b.clear()
2 >>> b
3 []
4 >>> dic
5 {'name1': 'passwd1', 'name2': 'passwd2'}
6 >>> dic.clear()
7 >>> dic
8 {}
fromkeys
1 >>> stu={}.fromkeys('hello','#') 2 >>> stu 3 {'h': '#', 'l': '#', 'o': '#', 'e': '#'}
get(k[,d])——其中key代表字典中key的值,字典中key写的是什么,取值的时候就需要些什么。可选参数d是指,如果没有这个key,就输出d的值。
1 stu = { 2 1: { 3 'name': 'alex', 4 'age': 18, 5 'gender': 'male' 6 }, 7 2: { 8 'name': 'lhf', 9 'age': 18, 10 'gender': 'male' 11 } 12 } 13 input_init=input("请输入学号:") 14 print(stu.get(int(input_init),'没有这个学号')) 15 16 17 》》》》》打印结果》》》》》》 18 19 请输入学号:1 20 {'age': 18, 'name': 'alex', 'gender': 'male'} 21 请输入学号:2 22 {'age': 18, 'name': 'lhf', 'gender': 'male'} 23 请输入学号:3 24 没有这个学号
keys()
1 >>> stu={}.fromkeys('hello','#') 2 >>> stu 3 {'h': '#', 'l': '#', 'o': '#', 'e': '#'} 4 >>> print(stu.keys()) #显而易见是提取字典中的所有的key作为一个列表 5 dict_keys(['h', 'l', 'o', 'e']) 6 >>> print(stu.values())#显而易见是提取字典中的所有的value作为一个列表 7 dict_values(['#', '#', '#', '#'])
pop(k[,d])——使用key进行删除,类似于get,如果没有得到值,可以利用d的值。字典中的pop必须要指定key。如果没有指定key,就会报错。字典和集合是无序的。
而popitem(),不需要参数,是随机删除字典中的一个映射,如果已经是空字典,继续删除就会报错。同时,这个方法的返回值是将删除的key:value作为一个元组返回。
setdefault(k[,d]) ——如果指定的key存在,则相当于d.get[key],如果不存在,就将d的值,和此key,加入到字典中。
def setdefault(self, k, d=None): # real signature unknown; restored from __doc__ """ D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D """ pass
1 stu = { 2 1: { 3 'name': 'alex', 4 'age': 18, 5 'gender': 'male' 6 }, 7 2: { 8 'name': 'lhf', 9 'age': 18, 10 'gender': 'male' 11 }, 12 3: { 13 'name': 'wo', 14 'age': 28, 15 'gender': 'male' 16 } 17 } 18 print(stu.setdefault(1,'d')) 19 print(stu.setdefault(4,'d')) 20 print(stu) 21 22 23 <><><<><输入结果><><><>< 24 25 {'gender': 'male', 'age': 18, 'name': 'alex'} 26 d 27 {1: {'gender': 'male', 'age': 18, 'name': 'alex'}, 2: {'gender': 'male', 'age': 18, 'name': 'lhf'}, 3: {'gender': 'male', 'age': 28, 'name': 'wo'}, 4: 'd'}
update() —— dic2.update(dic1) 将字典dic1中的内容更新到dic2中。※排重