#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:kevinfei
#关于Python3中字典类型的操作详解  关于Python3中字典的相关操作大全

#字典是无序的(因为它没有下标),key必须是唯一的
#字典是可变的,可以修改和添加
#创建字典
info = {'haha':12,'heihei':13,'wowo':45}
#查找字典的值value
#方法1
print(info['heihei']) #13  此方法必须确定字典中存在此key否则会报错
#方法2 推荐使用
print(info.get('heihei')) #13  当字典中没有此key时,会返回None
#修改字典
info['wowo'] = 14
print(info) #{'haha': 12, 'heihei': 13, 'wowo': 14}
#添加字典元素
info['loulou'] = 15
print(info) #{'haha': 12, 'heihei': 13, 'wowo': 14, 'loulou': 15}
#删除字典元素
#方法1
del info['haha']
print(info) #{'heihei': 13, 'wowo': 14, 'loulou': 15}
#方法2
a = info.pop('heihei')
print(a) #13  pop删除字典的同时会返回该key对应的值
print(info) #{'wowo': 14, 'loulou': 15}
#方法3
b = info.popitem() #随机删除一个字典元素
print(b)  #('loulou', 15)  popitem删除字典的同时会以元组的形式返回该元素的key和value
print(info) #{'wowo': 14}
#删除整个字典
#del info
#print(info) #NameError: name 'info' is not defined
info = {'haha':12,'heihei':13,'wowo':45}
#判断某个key是不是在这个字典里
print('wahaha' in info) #False
print('haha' in info) #True

#多级字典的嵌套和操作
book = {
    '中国':{'a':['好','不好'],'b':['好','不好']},
    '美国':{'c':['好','不好'], 'd':['好','不好']},
    '日本':{'e':['好','不好']}
}
print(book)
#修改多级字典的value
book['中国']['b'][0] = 'ok'
print(book)
print('+_+_+_+_+_+_+_+_+_+_+_+_+_+_+')
info = {'haha':12,'heihei':13,'wowo':45}
print(info.values()) #dict_values([12, 13, 45])  打印字典的所有值value
print(info.keys()) #dict_keys(['haha', 'heihei', 'wowo']) 打印字典的所有键key
print(list(info.values())) #[12, 13, 45]  将字典所有的value转成list
print(list(info.keys())) #['haha', 'heihei', 'wowo']  将字典所有的key转成list
print(info.setdefault('ww',78)) #78
print(info) #{'haha': 12, 'heihei': 13, 'wowo': 45, 'ww': 78}  增加一个'ww': 78  字典对象
print(info.setdefault('haha', 34)) #12
print(info) #{'haha': 12, 'heihei': 13, 'wowo': 45, 'ww': 78}
#'haha'的value并没有改成34
# Python 字典 setdefault() 方法和 get() 方法类似,返回指定键的值,
# 如果键不在字典中,将会添加键并将值设置为一个指定值,默认为None。
# get() 和 setdefault() 区别: setdefault() 返回的键如果不在字典中,
# 会添加键(更新字典),而 get() 不会添加键。
print('+++++++++++++================-')
info = {'haha':12,'heihei':13,'wowo':45}
b = {'ss':99, 'haha':88}
info.update(b) #没有返回值
print(info) #{'haha': 88, 'heihei': 13, 'wowo': 45, 'ss': 99} update()方法合并两个字典,并修改/增加字典对象
print(info.items()) #dict_items([('haha', 88), ('heihei', 13), ('wowo', 45), ('ss', 99)])
#返回字典所有的key和value
print(list(info.items())) #[('haha', 88), ('heihei', 13), ('wowo', 45), ('ss', 99)]

#字典的循环
info = {'haha':12,'heihei':13,'wowo':45}
#方法1(推荐使用)
for i in info:
    print(i, info[i])   #方法1 效率比较高,因为它是直接通过key找过val

"""
haha 12
heihei 13
wowo 45
"""
#方法2
for key,val in info.items():   #效率没有方法高,因为它需要把字典转成列表
    print(key, val)
"""
haha 12
heihei 13
wowo 45
"""