字典是一种key-value的数据类型。

字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

键必须是唯一的,但值则不必。

值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

 

字典的特性:

  • dict是无序的
  • key必须是唯一的,so 天生去重

 

创建:

1 dict1={1:2,'a':'A','b':{1:2,2:3}}
2 
3 dict1
4 Out[51]: {1: 2, 'a': 'A', 'b': {1: 2, 2: 3}}
View Code

字典的方法介绍:

1.dict.clear()  清空字典内的键值对

 1 help(dict.clear)
 2 Help on method_descriptor:
 3 
 4 clear(...)
 5     D.clear() -> None.  Remove all items from D.
 6 
 7 dict1.clear()
 8 
 9 dict1
10 Out[53]: {}
View Code

 

2.dict.copy() 浅拷贝

 1 dict1={1:2,'a':'A','b':{1:2,2:3}}
 2 
 3 help(dict.copy)
 4 Help on method_descriptor:
 5 
 6 copy(...)
 7     D.copy() -> a shallow copy of D  #浅拷贝
 8 
 9 
10 dict2=dict1.copy()
11 
12 dict2
13 Out[58]: {1: 2, 'a': 'A', 'b': {1: 2, 2: 3}}
View Code

 浅拷贝效果代码演示:

1 dict1['b'][1]=2333 
2 
3 dict1
4 Out[60]: {1: 2, 'a': 'A', 'b': {1: 2333, 2: 3}}
5 
6 dict2
7 Out[61]: {1: 2, 'a': 'A', 'b': {1: 2333, 2: 3}}
8 #浅拷贝同列表方法效果一样
View Code

 

3.dict.fromkeys()   创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值

 1 help(dict.fromkeys)
 2 Help on built-in function fromkeys:
 3 
 4 fromkeys(iterable, value=None, /) method of builtins.type instance
 5     Returns a new dict with keys from iterable and values equal to value. #创建一个新字典,以迭代变量中元素做字典的键,value为字典所有键对应的初始值。
 6 
 7 dict_new=dict.fromkeys(['name','age','sex'])  #无默认值得新字典
 8 dict_new
 9 Out[65]: {'age': None, 'name': None, 'sex': None}
10 
11 #设置value值为默认值
12 dict_new2=dict.fromkeys(['name','age','sex'],['zoe','18','female'])
13 dict_new2
14 Out[67]: 
15 {'age': ['zoe', '18', 'female'],
16  'name': ['zoe', '18', 'female'],
17  'sex': ['zoe', '18', 'female']}   #不会一一对应。
18 
19 #设置value值为默认值
20 dict_new3=dict.fromkeys(['name','age','sex'],0)
21 dict_new3
22 Out[69]: {'age': 0, 'name': 0, 'sex': 0}
View Code

 原理同浅拷贝,dict.fromkeys()在创建新字典的时候,后面指定的value值,列表等可迭代参数存储在一个内存位,故而只会对应到所有的key值,而不是一一对应到所有的key值。

 

4.dict.get() 指定键的值,如果值不在字典中返回默认值None。—— 获取字典值的正确姿势

 1 help(dict.get)
 2 Help on method_descriptor:
 3 
 4 get(...)
 5     D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.
 6 #指定键的值,如果值不在字典中返回默认值None。
 7 
 8 dict1
 9 Out[71]: {1: 2, 'a': 'A', 'b': {1: 2333, 2: 3}}
10 
11 dict1.get(1)
12 Out[72]: 2
13 dict1.get('b')
14 Out[73]: {1: 2333, 2: 3}
View Code

 dict.get('key') 返回value,在运行中如果没有找到“键”不会报错,默认返回None。可以指定返回的默认值。

dict['key'],通过取键的方式,如果字典中没有该“键”会报错,注意生产代码中不要使用它。

 

5.dict.items() 返回可遍历的(键, 值) 元组数组,数组组成新列表

 1 help(dict.items)
 2 Help on method_descriptor:
 3 
 4 items(...)
 5     D.items() -> a set-like object providing a view on D's items。
 6 
 7 dict1
 8 Out[75]: {1: 2, 'a': 'A', 'b': {1: 2333, 2: 3}}
 9 
10 dict1.items()
11 Out[76]: dict_items([(1, 2), ('a', 'A'), ('b', {1: 2333, 2: 3})])
View Code

 返回是(键,值)的元组组成的列表,在循环中使用这种方法,会降低运行效率,不建议使用。

 

6.dict.keys() 返回一个字典所有的键

 1 help(dict.keys)
 2 Help on method_descriptor:
 3 
 4 keys(...)
 5     D.keys() -> a set-like object providing a view on D's keys
 6 
 7 dict1
 8 Out[78]: {1: 2, 'a': 'A', 'b': {1: 2333, 2: 3}}
 9 
10 dict1.keys()
11 Out[79]: dict_keys([1, 'a', 'b'])
View Code

 

7.dict.values() 返回一个字典所有的值

 1 dict1.keys()
 2 Out[79]: dict_keys([1, 'a', 'b'])
 3 
 4 help(dict.values)
 5 Help on method_descriptor:
 6 
 7 values(...)
 8     D.values() -> an object providing a view on D's values
 9 
10 dict1.values()
11 Out[82]: dict_values([2, 'A', {1: 2333, 2: 3}])
View Code

 

8.dict.pop()  标准删除方法,删除指定键,返回指定键上的值;指定最少需要一个参数(删除的键)

 1 help(dict.pop)
 2 Help on method_descriptor:
 3 
 4 pop(...)
 5     D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
 6     If key is not found, d is returned if given, otherwise KeyError is raised。
 7 #移除特定的key值返回相应的值;如果没有找到该键,返回报错
 8 
 9 dict1.pop(1)  #移除特定的key值返回相应的值,
10 Out[86]: 2
11 
12 dict1.pop(1)  #如果没有找到该键,返回报错
13 Traceback (most recent call last):
14 
15   File "<ipython-input-87-66784dbc8199>", line 1, in <module>
16     dict1.pop(1)
17 
18 KeyError: 1
View Code

 

9.dict.popitem()  0参数,返回一个键值对(key,value)形式(返回的是随机删除的键值对)

 1 help(dict.popitem)
 2 Help on method_descriptor:
 3 
 4 popitem(...)
 5     D.popitem() -> (k, v), remove and return some (key, value) pair as a 2-tuple; but raise KeyError if D is empty.
 6 #移除并返回删除的键值对的元组;如果字典为空则会报错。
 7 
 8 dict1
 9 Out[90]: {'a': 'A', 'b': {1: 2333, 2: 3}}
10 
11 dict1.popitem()   #0参数,随机删除,返回删除的键值对。
12 Out[91]: ('b', {1: 2333, 2: 3})
13 
14 dict1
15 Out[92]: {'a': 'A'}  
16 
17 dict1.popitem('a')  #不需要指定参数,输入参数会报错
18 Traceback (most recent call last):
19 
20   File "<ipython-input-93-7f6358d38f28>", line 1, in <module>
21     dict1.popitem('a')
22 
23 TypeError: popitem() takes no arguments (1 given)
24 
25 
26 dict1.popitem()   #随机删除
27 Out[94]: ('a', 'A')
28 
29 dict1
30 Out[95]: {}
31 
32 dict1.popitem()   #空字典会报错
33 Traceback (most recent call last):
34 
35   File "<ipython-input-96-f2ec12fcbb94>", line 1, in <module>
36     dict1.popitem()
37 
38 KeyError: 'popitem(): dictionary is empty'
View Code

 

10.dict.setdefault() 如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。

 1 help(dict.setdefault)
 2 Help on method_descriptor:
 3 
 4 setdefault(...)
 5     D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
 6 #等价于dict.get(k,d),如果k不在dict中,设置dict[k]=d。
 7 
 8 dict1
 9 Out[98]: {}
10 
11 dict1.setdefault('name')
12 
13 dict1
14 Out[100]: {'name': None}
15 
16 dict1.setdefault('age',18)
17 Out[101]: 18
18 
19 dict1
20 Out[102]: {'age': 18, 'name': None}
View Code

 

11.dict.update() 把字典dict2的键/值对更新到dict里;如果dict2和dict中键都存在,更新;如果不存在键,则在dict中添加键值对

 1 help(dict.update)
 2 Help on method_descriptor:
 3 
 4 update(...)
 5     D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
 6     If E is present and has a .keys() method, then does:  for k in E: D[k] = E[k]  #将字典/迭代变量E中key进行迭代,设置D[k]=E[k],#更新对应的存在的键的值。
 7     If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v #E缺失key值,则把k,v迭代,设置D[k]=v.——添加键值对。
 8     In either case, this is followed by: for k in F:  D[k] = F[k]
 9 
10 info={'stu1102':'a',
11 'stu003':'b',
12 'stu004':'c'}
13 
14 b={1:2,3:4,'stu1102':'aaaaa'}
15 
16 info.update(b)
17 
18 info
19 Out[115]: {'stu1102': 'aaaaa', 'stu003': 'b', 'stu004': 'c', 1: 2, 3: 4}
View Code

 

 

增加键值对:

方法1:

1 info['1']=123456789
2 
3 info
4 Out[118]: {'stu1102': 'aaaaa', 'stu003': 'b', 'stu004': 'c', 1: 2, 3: 4, '1': 123456789}

方法2:dict.update()

 1 info.update({111:222,222:666})
 2 
 3 info
 4 
 5 Out[126]: 
 6 {'stu1102': 'aaaaa',
 7  'stu003': 'b',
 8  'stu004': 'c',
 9  1: 2,
10  3: 4,
11  '1': 123456789,
12  'new': 'setdefault value',
13  111: 222,
14  222: 666}

方法3:dict.setdefault()

 1 info.setdefault('new','setdefault value')
 2 Out[119]: 'setdefault value'
 3 
 4 info
 5 Out[120]: 
 6 {'stu1102': 'aaaaa',
 7  'stu003': 'b',
 8  'stu004': 'c',
 9  1: 2,
10  3: 4,
11  '1': 123456789,
12  'new': 'setdefault value'}

 

修改:

方法1:

 1 info['1']=None
 2 
 3 info
 4 Out[128]: 
 5 {'stu1102': 'aaaaa',
 6  'stu003': 'b',
 7  'stu004': 'c',
 8  1: 2,
 9  3: 4,
10  '1': None,
11  'new': 'setdefault value',
12  111: 222,
13  222: 666}

方法2:dict.update()

 1 info.update({1:'update'})
 2 
 3 info
 4 Out[131]: 
 5 {'stu1102': 'aaaaa',
 6  'stu003': 'b',
 7  'stu004': 'c',
 8  1: 'update',
 9  3: 4,
10  '1': None,
11  'new': 'setdefault value',
12  111: 222,
13  222: 666}

 

删除:

方法1:del  

 1 dict2
 2 Out[138]: {1: 2, 'a': 'A', 'b': {1: 2333, 2: 3}}
 3 
 4 del dict2  #删除整个字典对象
 5 
 6 dict2
 7 Traceback (most recent call last):
 8 
 9   File "<ipython-input-140-476dc5b54aa4>", line 1, in <module>
10     dict2
11 
12 NameError: name 'dict2' is not defined
1 dict
2 Out[144]: {1: 2, 2: 3}
3 
4 del dict[1]  #删除指定的键值对
5 
6 dict
7 Out[146]: {2: 3}

 方法2:dict.pop() 标准删除方式

 1 dict
 2 Out[146]: {2: 3}
 3 
 4 info
 5 Out[147]: 
 6 {'stu1102': 'aaaaa',
 7  'stu003': 'b',
 8  'stu004': 'c',
 9  1: 'update',
10  3: 4,
11  '1': None,
12  'new': 'setdefault value',
13  111: 222,
14  222: 666}
15 
16 info.pop(1)
17 Out[148]: 'update'

 方法3:dict.popitem() 随机删除,不可指定参数

 1 info.popitem()
 2 Out[150]: (222, 666)
 3 
 4 info
 5 Out[151]: 
 6 {'stu1102': 'aaaaa',
 7  'stu003': 'b',
 8  'stu004': 'c',
 9  3: 4,
10  '1': None,
11  'new': 'setdefault value',
12  111: 222}

方法4:dict.clear() 清除字典键值对

1 dict
2 Out[152]: {2: 3}
3 
4 dict.clear()
5 
6 dict
7 Out[154]: {}

 

查看,查找:

方法1:

 1 info
 2 Out[155]: 
 3 {'stu1102': 'aaaaa',
 4  'stu003': 'b',
 5  'stu004': 'c',
 6  3: 4,
 7  '1': None,
 8  'new': 'setdefault value',
 9  111: 222}
10 
11 info[3]
12 Out[156]: 4

方法2:dict.get()

 1 info.get('stu1102') 2 Out[158]: 'aaaaa' 

方法3:dict.items()

1 info.items()
2 Out[159]: dict_items([('stu1102', 'aaaaa'), ('stu003', 'b'), ('stu004', 'c'), (3, 4), ('1', None), ('new', 'setdefault value'), (111, 222)])

方法4:dict.keys()

1 info.keys()
2 Out[160]: dict_keys(['stu1102', 'stu003', 'stu004', 3, '1', 'new', 111])

方法5:dict.values()

1 info.values()
2 Out[161]: dict_values(['aaaaa', 'b', 'c', 4, None, 'setdefault value', 222])

方法6:k in dict  返回bool,标准用法

1 'stu003' in info    #在python2.x中,有一个dict.has_key(k)的方法,已经弃用。
2 Out[162]: True
3 
4 '0' in info
5 Out[163]: False

方法7:循环

  方法一:最佳使用方式

 1 for key in info:
 2     print(key,info[key])
 3     
 4 stu1102 aaaaa
 5 stu003 b
 6 stu004 c
 7 3 4
 8 1 None
 9 new setdefault value
10 111 222

  方法二: #会先把dict转成list,数据里大时莫用

 1 for k,v in info.items():
 2     print(k,v)
 3     
 4 stu1102 aaaaa
 5 stu003 b
 6 stu004 c
 7 3 4
 8 1 None
 9 new setdefault value
10 111 222

 


 

posted on 2017-06-15 15:16  Zoe233  阅读(487)  评论(0)    收藏  举报