day08-python-字典学习
1. 字典的概述
字典是一种可变数据类型,但与list、set不一样的是,他是由{}包含键值对组成的,其中键可以是任意的不可变数据类型,键也允许空,而值可以是任意数据类型。键是不可重复的,如果键重复的话,后面的键值会覆盖之前的键值。
2. 字典的初识
dict1 = {'小红': 12, '小明': 14, '张三': 25}
3. 字典的创建
- 带元素的初始化
dict1 = {'小红': 12, '小明': 14, '张三': 25}
- 字典的推导式
dict2 = {x: x * x for x in range(10)}
- 构造函数创建
dict3 = ()
dict4 = dict([('小红', 12), ('小明', 14), ('张三', 25)])
dict5 = dict(小红=12, 小明=14, 张三=25)
dict6 = dict({'小红': 12, '小明': 14}, 张三=25)
dict7 = dict(zip(['小红', '小明', '张三'], [12, 14, 25]))
print(dict4 == dict5 == dict6 == dict7 == dict8) #返回True
-
dict.fromkeys()创建
fromkeys() 使用给定的多个键创建一个新字典,值默认都是 None,也可以传入一个参数作为默认的值。
list1 = ['小红', '小明', '张三'] dic1 = dict.fromkeys(list1) #{'小红': None, '小明': None, '张三': None} dic2 = dict.fromkeys(list1, 18) #{'小红': 18, '小明': 18, '张三': 18}
-
copy 与deepcopy()方式创建
关于copy 与deepcopy,在day06-python list、tuple学习中已经详细描述了,字典中就不再重复描述了。
4. 字典元素的获取
-
d[key]
用返回字典的key对应的value。如果key不在映射中,则引发KeyError异常。
-
get(key[, default])
如果key在字典中,则返回key的值,否则默认。如果没有给出default,则默认为None,因此该方法永远不会引发KeyError。
dict1 = {'小红': 12, '小明': 14, '张三': 25 } print(dict1['小红']) #输出 12 print(dict1.get('小红')) #输出 12 print(dict1.get('李四',-1)) #输出 -1 print(dict1.get('李四')) #输出 None #print(dict1['李四']) #KeyError: '李四'
5. 字典元素新增
-
直接键值对添加
语法: dic[key]=value
dict8 = ({'小红': 12, '小明': 14, '张三': 25})
dict8['李四'] = 15
print(dict8) #输出:{'小红': 12, '小明': 14, '张三': 25, '李四': 15}
-
update()方法
语法:update([other])
使用其他键/值对更新字典,覆盖现有键。返回None。
dict8 = ({'小红': 12, '小明': 14, '张三': 25})
dict8.update(李四=15)
#dict8.update(李四=15,王五=19)
#dict8.update({'李四': 15})
#dict8.update([('李四', 15)])
-
setdefault()方法
语法:setdefault(key[, default])
当key不存在字典中是插入元素,插入value为default并返回default value。当key存在时候返回value
dict8.setdefault('李四', 15)
6. 字典元素的更新
字典元素的更新与字典元素的新增操作类似,有直接用键值对更新和通过update方法更新
示例:
dict8 = ({'小红': 12, '小明': 14, '张三': 25})
#dict8['小红']=18
dict8.update(小红=18)
7. 字典元素的删除
-
clear()
语法:clear()
清空字典元素,返回空字典
dict8 = ({'小红': 12, '小明': 14, '张三': 25})
dict8.clear()
-
del
语法: del d[key]
从字典中移除d[key]。如果key不在映射中,将引发KeyError异常。
dict8 = ({'小红': 12, '小明': 14, '张三': 25})
del dict8['小红']
#del dict8['李四'] #KeyError: '李四'
print(dict8) #{'小明': 14, '张三': 25}
-
pop()
语法:pop(key[, default])
如果key在字典中,则删除它并返回其值,否则返回default值。如果default未指定且key不在字典中,则引发KeyError。
dict8 = ({'小红': 12, '小明': 14, '张三': 25})
print(dict8.pop('小红')) #输出: 12
#print(dict8.pop('小红', 100)) #key存在,即使给了默认值,也只会返回删除的value值
print(dict8.pop('李四', -1)) #输出: -1
#dict8.pop('李四') # KeyError: '李四'
-
popitem()
语法:popitem()
从字典中删除并返回一个(键,值)对。键值对按后进先出顺序返回【注意:3.7之前的版本是任意返回一个键值对】。如果字典为空,调用popitem()将引发KeyError
dict9 = {'species': 'cat', 'name': 'hello cat' , 'age': [0,10]}
print(dict9.popitem()) #('age', [0, 10])
8. 字典元素的遍历
注意在遍历的字典的时候,别又去新增、删除字典中元素!!
字典视图方式迭代
字典自带的三个方法 d.items()、d.keys()、d.values(),分别返回如下对象:它们都是原字典的视图,修改原字典对象,视图对象的值也会发生改变。
-
keys
语法:d.keys()
返回字典的键
dict1 = {'小红': 12, '小明': 14, '张三': 25}
for key in dict1.keys():
print(f'{key}:{dict1[key]}', end=' ') #小红:12 小明:14 张三:25
# for key in dict1:
# print(f'{key}:{dict1[key]}', end=' ') #for key in dict 与 for key in dict1.keys()等价
-
values
语法:d.values()
返回字典值
dict1 = {'小红': 12, '小明': 14, '张三': 25} for value in dict1.values(): print(value, end=' ')
-
items
语法:d.item()
返回 (key,value )的键值对元组
for item in dict1.items():
print(item ,end=' ') #('小红', 12) ('小明', 14) ('张三', 25)
for k,v in dict1.items():
print(f'{k}:{v}',end=' ') #小红:12 小明:14 张三:25
iter迭代
-
iter
语法:iter(dictview)
返回(key, value)的元组)的迭代器。键和值按插入顺序迭代返回。
dict1 = {'小红': 12, '小明': 14, '张三': 25}
for i in iter(dict1):
print(i, dict1[i], sep=':', end=' ')
扩展
py3.6之前主要通过 有序字典(OrderDict来实现字典的有序 ,在py3.6之后,字典都为有序,此处的有序指的是按照添加顺序排序, 有序字典可以通过来实现,声明后,其实例对象的用法与普通字典使用一样。【注意】OrderedDict 的大小是一个普通字典的两倍,因为它内部维 护着另外一个链表,所以要真用使用,要考虑数据量呀!!
参考资料:
python官网
练习:
意】OrderedDict 的大小是一个普通字典的两倍,因为它内部维 护着另外一个链表,所以要真用使用,要考虑数据量呀!!
参考资料:
python官网
练习: