day08-python-字典学习

day08-python-字典学习


1. 字典的概述

字典是一种可变数据类型,但与list、set不一样的是,他是由{}包含键值对组成的,其中键可以是任意的不可变数据类型,键也允许空,而值可以是任意数据类型。键是不可重复的,如果键重复的话,后面的键值会覆盖之前的键值。

2. 字典的初识

dict1 = {'小红': 12, '小明': 14, '张三': 25}

image-20221002101937895

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官网

练习:

牛客网-python入门-09字典

意】OrderedDict 的大小是一个普通字典的两倍,因为它内部维 护着另外一个链表,所以要真用使用,要考虑数据量呀!!

参考资料:

python官网

练习:

牛客网-python入门-09字典

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值