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中。※排重

 

posted @ 2016-10-25 20:38  bkywanqian  阅读(227)  评论(0编辑  收藏  举报