Day03_字典的使用

本文介绍了Python中字典的现代用法,包括字典推导式创建、映射合并、处理可变值、模式匹配、以及可哈希对象和处理缺失键的defaultdict和UserDict类。
摘要由CSDN通过智能技术生成

一、 字典的现代用法

1.1 字典推导式

students = [
    (18, '张三'),
    (21, '李四'),
    (25, '王五')
]
# 字典推导式可以从任何可迭代序列中进行创建
dic = {name : age for age, name in students}
print(dic)

1.2 映射合并(Python3.9)

d1 = {'a': 10, 'b': 20, 'c': 30}
d2 = {'c': 40, 'd': 50}
# 映射合并,生成一个新的映射对象
d3 = d1 | d2
print(d3)
print(id(d1))
print(id(d2))
print(id(d3))
# 原地合并,不会产生新的对象
d1 |=  d2
print(d1)
print(id(d1))
print(id(d2))
print(id(d3))

1.3 插入或更新可变的值

d1 = {'a': [20]}
# setdefault 查找key,找到则返回key对应的value,找不到则插入key
print(d1.setdefault('a'))
print(d1)
# 默认插入的key值为None,同时返回None
print(d1.setdefault('b'))
print(d1)
# 可以在key后面添加一个默认参数,可以使用默认参数代替None
print(d1.setdefault('c', [500]))  # [500]
print(d1)  # {'a': [20], 'b': None, 'c': [500]}

使用模式匹配处理映射

# 参数类型为字典,返回值为list类型,仅仅是个提示,不遵守也没有任何问题
def get_create(record:dict) -> list:
    match record:
        # 匹配type=student, author为序列的内容
        case {'type':'student', 'author':[*names]}:
            print("names:", names)
        # 匹配type=student, author为任意内容的对象
        case {'type': 'student', 'author': name}:
            print("name:", name)
        case _:
            print("没有匹配到内容")
d1 = {'type':'student', 'author':(1, 2, 3)}
d2 = {'type':'student', 'author': 'th'}
d3 = {'type':'student'}
d4 = {'type':'stu', 'author':5}
get_create(d1)
get_create(d2)
get_create(d3)
get_create(d4)

'可哈希’的定义

1. 一个对象的哈希吗在整个生命周期内永不发生改变(依托__hash__),而且可与其他对象比较(__eq__),这个对象就是可哈希的
2. 两个可哈希对象仅当哈希码相同时相等
3. 数值类型和扁平类型(str、bytes)是可哈希的
4. 如果容器类型不可变,且容器类型里面的数据都是可哈希的,该容器也是可哈希的
5. 用户自定义的类型是可哈希的,因为自定义类型的哈希码取自id()
6. 如果要修改__eq__和__hash__,需要考虑是在生命周期内永不发生改变的实例变量作为哈希码,这样对象才是可哈希的

处理字典中缺失的键

defaultdict

import collections
# 创建一个defaultdict对象,参数检查不支持具体参数,只能设置为参数类型 int float str list tuple dict
d = collections.defaultdict(dict)
# 如果查询时找不到key,将返回默认类型的数值 列表为空列表 字典为空字典 并在defaultdict对象中添加这个key
print(d['hello'])
print(d)
# 可以和字典一样,通过d[key] = value 进行键值设计
d['hi'] = "你好"
print(d)
# 如果可以查询到key,将直接返回key的值,不会再做其他操作
print(d['hi'])
# 字典也不会再发生改变
print(d)

missing

class UserDict(dict):
    # 处理缺失键的逻辑在__missing__中定义,缺失键,就是__getitem__查询失败后将转到__missing__中
    def __missing__(self, key):
        return "hello"
    def get(self, key, default=None):
        return self[key]
    # 查询某个kye是否在字典对象中会调用这个特殊函数
    def __contains__(self, item):
        return item in self.keys() or str(item) in self.keys()
d = UserDict()
print(d.get('hello', default="你好"))
print(d['hi'])  # 自动调用__getitem__方法
d['hi'] = "你好"
print(d['hi'])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值