Python——字典dict

什么是字典

字典是一种可变容器模型,且可以储存任意类型对象。为什么称之为字典,是因为,在使用过程中就像查字典,你要查 ‘apple’ 这个单词,你通过首字母,会先查找 ‘a’ ——> ‘p’——>’p’ 然后你就找到了 ‘apple’ ,而不需要像列表一样从第一个元素开始找到最后一个元素,所以某种程度上来说,字典要比列表快的多,而 list 越大,查找就越慢。

定义:在{}内用 ‘,’ 分隔开多个 key:value ,通常 key 必须是一个不可变的类型,而通常呢我们使用字符串来表达key,用来描述 value 的特征, 而value可以是任意数据类型。

1
2
3
4
5
6
7
8
# e.g.
info={
'name':'David',
'age':18,
'gender':'male',
'height':180,
'hobbies':['programming','read','fitness']
}

字典的特性

  • 字典value可以是任何的python对象,但key不行。
  • 不允许同一个key出现两次。创建时如果同一个key被赋值两次,后一个值会被记住
  • key必须不可变, 所以可以用数字,字符串或元组充当,而用列表就不行
  • 能存多个值
  • 无序
  • 可变(值可以变,id不变)
  • 不可hash

字典的使用

####访问字典里的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> info={
... 'name':'David',
... 'age':18,
... 'gender':'male',
... 'height':180,
... 'hobbies':['programming','read','fitness']
... }
>>> info['name'] # 按key取值
'David'
>>> info['age']
18
>>> info['hobbies']
['programming', 'read', 'fitness']
>>> info['hobbies'][2] # 先按key取值,再按列表取值
'fitness'

计算字典元素个数,即计算key的总数

1
2
3
4
5
6
7
8
9
>>> info={
... 'name':'David',
... 'age':18,
... 'gender':'male',
... 'height':180,
... 'hobbies':['programming','read','fitness']
... }
>>> len(info)
5

按key存取值:可存可取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> info={
... 'name':'David',
... 'age':18,
... 'gender':'male',
... 'height':180,
... 'hobbies':['programming','read','fitness']
... }
>>> info['weight']=130 # 往字典里添加元素
>>> info
{'name': 'David', 'age': 18, 'gender': 'male', 'height': 180, 'hobbies': ['programming', 'read', 'fitness'], 'weight': 130}

# get
>>> a = info.get('name')
>>> a
'David'
>>> a = info.get('nameXXX') # 取不到值 不会报错 会返回一个None
>>> print(a)
None

删除元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> info={
... 'name':'David',
... 'age':18,
... 'gender':'male',
... 'height':180,
... 'hobbies':['programming','read','fitness']
... }
>>> del info['name'] # 直接修改原值
>>> info
{'age': 18, 'gender': 'male', 'height': 180, 'hobbies': ['programming', 'read', 'fitness']}
>>> info.clear() # 清空字典
{}
>>> del info # 删除字典
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'info' is not defined

成员运算 in 和 not in

1
2
3
4
5
6
7
8
9
10
11
>>> info={
... 'name':'David',
... 'age':18,
... 'gender':'male',
... 'height':180,
... 'hobbies':['programming','read','fitness']
... }
>>> 18 in info # 查看的是key是否在字典中
False
>>> 'age' in info
True

循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
>>> info={
... 'name':'David',
... 'age':18,
... 'gender':'male',
... 'height':180,
... 'hobbies':['programming','read','fitness']
... }
>>> for k in info.keys() # 取key
... print(k)
...
name
age
gender
height
hobbies
>>> for k in info: # 默认输出key
... print(k)
...
name
age
gender
height
hobbies
# 取value
>>> for v in info.values():
... print(v)
...
David
18
male
180
['programming', 'read', 'fitness']
>>> for k,v in info.items(): # 同时取出key 和 value
... print(k,v)
...
name David
age 18
gender male
height 180
hobbies ['programming', 'read', 'fitness']

快速创造一个字典

1
2
3
4
5
6
7
8
9
# fromkeys:需求是快速新造出一个字典,value的初始值全部都为None
# key来自一个列表
>>> keys = ['name','age','gender']
>>> d = {}
>>> for k in keys:
... d[k] = None
>>> d={}.fromkeys(keys,None)
>>> print(d)
{'name': None, 'age': None, 'gender': None}

setdefault

1
2
3
4
5
6
7
8
9
10
>>> info={
... 'name':'David',
... 'age':18,
... 'gender':'male',
... 'height':180,
... 'hobbies':['programming','read','fitness']
... }
>>> res = info.setdefault('age', 123456)
# 在key存在的情况下不修改值,会返回原值
>>> res 18