dict的基本操作

demo1

dic1 = {'name':'whw','age':22,'sex':'male'}
dic2 = {'name':'whw'}
##注意,字典时无序的,没有要求字典排序
'''
特别注意:字典没有remove方法!!只有列表有remove方法!
'''
#创建一个字典——dict.fromkeys()
dic3 = dict.fromkeys(['name1','name2','name3'],'whw1')
print(dic3)#{'name1': 'whw1', 'name2': 'whw1', 'name3': 'whw1'}

#增
#setdefault 在字典中添加键值对,如果只有键那对应的值是none,但是如果原字典中存在设置的键值对,则他不会更改或者覆盖
dic1.setdefault('k','v')
print(dic1)#{'name': 'whw', 'age': 22, 'sex': 'male', 'k': 'v'}
dic1.setdefault('k','v1')
print(dic1)#{'name': 'whw', 'age': 22, 'sex': 'male', 'k': 'v'}
##添加键值对
dic1['n'] = 'm'
print(dic1)#{'name': 'whw', 'age': 22, 'sex': 'male', 'k': 'v', 'n': 'm'}

#删
'''
del dic2
print(dic2)#会报错——NameError: name 'dic2' is not defined
'''
# 清空字典
print('dic1:',dic1)#dic1: {'name': 'whw', 'age': 22, 'sex': 'male', 'k': 'v', 'n': 'm'}
dic2.clear()
print(dic2) # {}
#pop方法——pop(key,'无key返回的值')————返回删除的“值”
print(dic1.pop('k')) #v
print(dic1.pop('w','没有这个键')) #没有这个键
#popitem()方法————
'''
# 3.5之前随机删除字典中的某个键值对,并将删除的键值对以元组的形式返回
# 3.6之后删除的是最后的键值对
'''
print(dic1.popitem())#('n', 'm')
print(dic1)#{'name': 'whw', 'age': 22, 'sex': 'male'}

#改
#update方法——字典的扩展
dic3 = {'a1':'b'}
dic1.update(dic3)
print(dic1)#{'name': 'whw', 'age': 22, 'sex': 'male', 'a1': 'b'}
#找到对应的键直接改
dic3['a1'] = 123
print(dic3)#{'a1': 123}

###查
print(dic1)#{'name': 'whw', 'age': 22, 'sex': 'male', 'a1': 'b'}
print(dic1.get('name'))#whw
print(dic1.get('whw','没有这个key'))#没有这个key
#查出所有的key
d1 = dic1.keys()
print(d1)#dict_keys(['name', 'age', 'sex', 'a1'])
print(type(d1))#<class 'dict_keys'>
print(list(d1))#['name', 'age', 'sex', 'a1']
#查出所有的键值对
d2 = dic1.items()
print(d2)#dict_items([('name', 'whw'), ('age', 22), ('sex', 'male'), ('a1', 'b')])
#查出所有的值
d3 = dic1.values()
print(d3)#dict_values(['whw', 22, 'male', 'b'])

##字典的遍历
#i是序号,默认是0
#v是字典的键
for i,v in enumerate(dic1,1):
    print(i,v,dic1[v])
#或者可以这样:但是没有数字了
for k,v in dic1.items():
    print(k,v)

##练习
###一行操作改变dic11字典:
dic11 = {'k1':'v111','a1':'b'}
dic111 = {'k1':'v1','k2':'v2','k3':'v3'}
dic11.update(dic111)
print(dic11)#{'k1': 'v1', 'a1': 'b', 'k2': 'v2', 'k3': 'v3'}
print(dic11.update(dic111))#None

demo2

###python3.5(包括3.5之前)字典是无序的
###python3.6之后字典是有序的

### 字典的优点:
            #字典可存储大量的关系数据
            #字典的查询的速度特别快

# 注意,如果字典的两个键一样了,取后面的!!!
dicc = {
    'name':'wxx',
    'name':'wanghw',
    'age':22
}
print(dicc) #{'name': 'wanghw', 'age': 22}

dic1 = {'name':'wanghw','age':22,'sex':'male'}
dic2 = {'name':'whw'}

# 增
##添加键值对
dic2['age'] = 18
print(dic2)
##setdefault 在字典中添加键值对,如果只有键那对应的值是none,但是如果原字典中存在设置的键值对,则他不会更改或者覆盖
dic2.setdefault('k','v')
print(dic2)#{'name': 'whw', 'age': 18, 'k': 'v'}
# 如果原字典中存在设置的键值对,则他不会更改或者覆盖
dic2.setdefault('k',123)
print(dic2)#{'name': 'whw', 'age': 18, 'k': 'v'}

# 删
## del

## clear

##pop——pop(key,'无key返回的值')————返回删除的“值”
print(dic2.pop('k'))
print(dic2.pop('w','没有这个键'))

##popitem——随机删除字典中的某个键值对,并将删除的键值对以元组的形式返回
print(dic3.popitem())
print(dic3)

# 改 
##扩展——update————存在的键值对“覆盖”、不存在的键值对添加到最后
dic3 = {'a1':'b'}
dic1.update(dic3)
print(dic1)
'''
注意如果update的字典有共同的键,则"更新"了:
dict1 = {'k1':'v111','a1':'b'}
dict2 = {'k1':'v1','k2':'v2','k3':'v3'}
dict1.update(dict2)
print(dict1)#{'k1': 'v1', 'a1': 'b', 'k2': 'v2', 'k3': 'v3'}
'''
## 找到对应的值直接改
dic1['a1'] = 'A'
print(dic1)

# 查
##直接指定键——不好,没有会报错
print(dic1['name'])
# print(dic1['name1'])#没有的话会报错
##get方法
print(dic1.get('name'))
print(dic1.get('name1','没有这个键'))#没有的话不会报错,默认返回None

##查出所有的key
print(dic1.keys())
print(type(dic1.keys()))#<class 'dict_keys'>
###可以转化成列表
print(list(dic1.keys()))#['name', 'age', 'sex', 'a1']

##查出所有键值对——元组形式返回
print(dic1.items())#dict_items([('name', 'wanghw'), ('age', 22), ('sex', 'male'), ('a1', 'A')])

## 查出所有值
print(dic1.values())#dict_values(['wanghw', 22, 'male', 'A'])

## 字典的遍历——enumerate:i默认从0开始,v是字典的键
for i,v in enumerate(dic1):
    print(i,v,dic1[v])
'''
0 name wanghw
1 age 22
2 sex male
3 a1 A
'''
# 或者可以这样:
for i,v in enumerate(dic1.items()):
    print(i,v)
'''
0 ('name', 'wanghw')
1 ('age', 22)
2 ('sex', 'male')
3 ('a1', 'A')
'''
# 还可以这样:
for k,v in dic1.items():
    print(k,v)
'''
name wanghw
age 22
sex male
a1 A
'''

###练习
###一行操作改变dic11字典:
dict1 = {'k1':'v111','a1':'b'}
dict2 = {'k1':'v1','k2':'v2','k3':'v3'}
dict1.update(dict2)
print(dict1)#{'k1': 'v1', 'a1': 'b', 'k2': 'v2', 'k3': 'v3'}
# dict2.update(dict1)
# print(dict2)

setdefault的一个使用案例

'''# 有字符串"k: 1|k1 :2|k2:3  |k3 :4" 处理成字典 {'k':1,'k1':2....}'''

str1 ='k: 1|k1 :2|k2:3  |k3 :4'
list1 = str1.split('|')
dic = {}
#注意有空格
print(list1)#['k: 1', 'k1 :2', 'k2:3  ', 'k3 :4']
for i in list1:
       #再次将里面的每个字符串按照冒号分割成键与值
       list2 = i.split(':')
       #注意先消除一下空格
       dic.setdefault(list2[0].strip(),int(list2[1].strip()))
print(dic)#{'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}

字典生成式

巧用字典的生成式可以提升代码的执行效率,下面是一个例子:

name_dic = {"001":"whw","002":"sasuke","003":"naruto"}

hobby_dic = {"001":"coding","002":"千鸟流","003":"螺旋丸"}

# 字典生成式
dic = {name_dic[key]:value for key,value in hobby_dic.items()}
print(dic) 
"""
{'whw': 'coding', 'sasuke': '千鸟流', 'naruto': '螺旋丸'}
"""

使用字典映射代替if-else分支

Python的字典实际上是一种映射关系,在实际中用好了这种映射关系可以大大的提升我们代码的水平。

def whw():
    print("whw...")

def naruto():
    print("naruto...")

def sasuke():
    print("sasuke...")

func_dic = {
    "key1":whw,
    "key2":naruto,
    "key3":sasuke,
}
# 如果有参数的话需要对应函数的参数数量保持一致
for key in func_dic:
    func_dic[key]()

删除字典中的数据的方法

一般情况下字典不支持在遍历的时候直接删除字典中的元素的,删除字典中元素的正确方法如下:

dic1 = {"whw":[18,12,22],"naruto":[0,0,0],"sasuke":[22,22,12],"sakurua":[0,1,2],"wanghw":[0,0,0]}

for key in list(dic1.keys()):
    # 删除全是0的
    if sum(dic1[key]) == 0:
        del dic1[key]
print(dic1) # {'whw': [18, 12, 22], 'sasuke': [22, 22, 12], 'sakurua': [0, 1, 2]}

字典的打散传参

浅谈Python中字典的打散传参