[TOC]
----
# 字典
## 为什么需要字典:
有时候我们需要存储一组相关的数据的时候,
比如要存储一个人的信息,那么有username,age,birthday等,
如果这些信息都存储在列表中,或者数组中,
比如['username','age','birthday']那么用起来可能不是很方便。
比较方便的操作是,我直接通过username这个key就可以拿到这个值,
我通过username就可以给这个key设置值,
那么就可以通过字典的方式实现我们的需求。
字典 可以理解为键值对形式的`json格式字符串形式` 或者 `php中的关联数组`
1. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,
格式如下所示:
>d = {key1 : value1, key2 : value2 }
1. 字典是另一种可变容器模型,且可存储任意类型对象。
1. 键必须是唯一的,但值则重复。
1. 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
1. 元素是无序的
一个简单的字典实例:
>dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
## 创建字典:
```python
#方法一:
dict1 = { 'abc': 456 };
dict2 = { 'abc': 123, 98.6: 37 };
#方法二:
info = {}
info['name']=name
info['age']=age
info['gender']=gender
#输出
print(info) #{'name': 'lisi', 'age': 20, 'gender': '男'}
print(info['name']) #lisi
print(info['age']) #20
# print(info['color']) #20 报异常
# 也可以指定一个,在没有获取到这个值时候的默认值
print(info.get('color','red')) #red
方法三:使用dict函数:
person = dict(username='zhiliao',age=18) #{'username': 'zhiliao', 'age': 18}
print(person)
```
## 基本操作:
- len(d):返回字典的键值对的长度。
- d[k]:获取k这个key对应的值。
- d[k] = v:设置键为k的值为v,如果字典中不存在键为k的这一项,那么自动的添加进去。
- del d[k]:删除d这个字典中键为k的这一项数据。
- k in d:检查d这个字典中是否包含键为k的这一项。
- 字典中的键可以是任意的不可变类型,比如:浮点类型、整形、长整形、字符串或者元组。
## 字典常用方法:
1. clear:清除字典中所有的项。
```python
a = {'username':'zhiliao','age':18}
print(a) #{'username': 'zhiliao', 'age': 18}
a.clear()
print(a) #{}
```
1. get:访问字典中那个键对应的那个值。这个方法不会抛出异常。
```python
a = {'username':'zhiliao','age':18}
username = a.get('username')
print(username) #print(city)
city = a.get('city') # 获取到的是一个None。
print(city) #None
# 也可以指定一个,在没有获取到这个值时候的默认值
city = a.get('city','changsha')
print(city) #changsha
# city = a['city']
# print(city) # 抛出异常
```
1. pop:用来获得对应于给定键的值,然后将这个键和值的项从字典中删除。会返回这个值。
```python
d = {'x':1,'y':2}
b=d.pop('x')
print(b) # 1
print(d) # {'y': 2}
```
1. popitem:随机的移除字典中的一项。因为字典是无序的,所以是随机的。
```python
d= {'name': '菜鸟教程', 'alexa': 10000, 'url': 'www.runoob.com'}
a=d.popitem() # 随机弹出一个值
print(d) # {'name': '菜鸟教程', 'alexa': 10000}
print(a) #('url', 'www.runoob.com')
```
1. update:用一个字典更新另外一个字典,如果碰到相同的键,则会覆盖。
```python
a = {'url':'http://www.baidu.com/','title':"baidu"}
b = {"url":"http://www.google.com/",'new_value':"new_value"}
a.update(b)
print(a) #{'url': 'http://www.google.com/', 'title': 'baidu', 'new_value': 'new_value'}
```
1. setdefault:如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。
1. key in dict
if k in dict:判断某个键是否在字典中存在。
```python
dict = {'Name': 'Runoob', 'Age': 7}
# 检测键 Age 是否存在
if 'Age' in dict:
print("键 Age 存在")
else :
print("键 Age 不存在")
# 检测键 Sex 是否存在
if 'Sex' in dict:
print("键 Sex 存在")
else :
print("键 Sex 不存在")
# not in
# 检测键 Age 是否存在
if 'Age' not in dict:
print("键 Age 不存在")
else :
print("键 Age 存在")
# 以上实例输出结果为:
# 键 Age 存在
# 键 Sex 不存在
# 键 Age 存在
```
## 遍历字典:
1. 遍历字典中所有的key:使用keys方法,这个方法将所有的键以列表的方式返回。
```python
a = {"url":"www.baidu.com",'title':"baidu"}
for x in a.keys():
print x
```
1. 遍历字典中所有的key:使用iterkeys方法,这个方法将返回一个迭代器,用来遍历所有的键的。
```python
a = {"url":"www.baidu.com",'title':"baidu"}
for x in a.iterkeys():
print x
```
1. 遍历字典中所有的value:使用values方法,这个方法将所有的值以列表的方式返回。
```python
a = {"url":"www.baidu.com",'title':"baidu"}
for x in a.values():
print x
```
1. 遍历字典中所有的value:使用itervalues方法,这个方法将返回一个迭代器,用来遍历所有的值。
```python
a = {"url":"www.baidu.com",'title':"baidu"}
for x in a.itervalues():
print x
```
1. 遍历字典中所有的键值对:使用items方法,这个方法将所有的键和值以列表的方式返回。
```python
a = {"url":"www.baidu.com",'title':"baidu"}
for key,value in a.items():
print key
print value
```
1. 遍历字典中所有的键值对:使用iteritems方法,这个方法将返回一个迭代器,用来遍历所有的键和值。
```python
a = {"url":"www.baidu.com",'title':"baidu"}
for key,value in a.iteritems():
print key
print value
```
手册:
<a href="https://www.runoob.com/python3/python3-dictionary.html" target="_blank
">https://www.runoob.com/python3/python3-dictionary.html</a>
## 直接赋值和 copy 的区别
可以通过以下实例说明:
```python
dict1 = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
dict2 = dict1.copy()
print ("新复制的字典为 : ",dict2) #新复制的字典为 : {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
dict1 = {'user':'runoob','num':[1,2,3]}
dict2 = dict1 # 浅拷贝: 引用对象
dict3 = dict1.copy() # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
# 修改 data 数据
dict1['user']='root'
dict1['num'].remove(1)
# 输出结果
print(dict1) #{'user': 'root', 'num': [2, 3]}
print(dict2) #{'user': 'root', 'num': [2, 3]}
print(dict3) #{'user': 'runoob', 'num': [2, 3]}
```
## 浅拷贝和深拷贝的区别
<a href="https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html" target="_blank">https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html</a>