• 《流畅的python》阅读笔记 - 第三章:字典和集合


    泛映射类型

    isinstance(object,object_type) 用来检测一个object对象是不是一个object_type类型.所以isinstance(object,abc.Mapping)用来检测object是不是映射类型.

    字典推导

    例程示例了字典的推导:

    #创建一个列表,元素为集合
    DIAL_CODES = [ 
        (86, 'China'),
        (91, 'India'),
        (1, 'United States'),
        (62, 'Indonesia'),
        (55, 'Brazil'),
        (92, 'Pakistan'),
        (880, 'Bangladesh'),
        (234, 'Nigeria'),
        (7, 'Russia'),
        (81, 'Japan'),
        ]
    
    #拆分DIAL_CODES里面的代码,code 到 code,country 到 country
    #注意到,country_code 和 DIAL_CODES 的 country 和 code 的顺序是相反的
    country_code = {country:code for code,country in DIAL_CODES}
    print(country_code,end="\n\n\n")
    
    country_code_2 = {code:country.upper()
                      for country,code in country_code.items()
                      if code <76}
    print(country_code_2)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    输出:

    {'China': 86, 'India': 91, 'United States': 1, 'Indonesia': 62, 'Brazil': 55, 'Pakistan': 92, 'Bangladesh': 880, 'Nigeria': 234, 'Russia': 7, 'Japan': 81}
    
    
    {1: 'UNITED STATES', 62: 'INDONESIA', 55: 'BRAZIL', 7: 'RUSSIA'}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以通过集合items()方法来获取一个可迭代的列表,然后用if来限制条件.

    用 setdefault处理找不到的键

    使用 setdefault可以节省一些操作:

    """创建从一个单词到其出现情况的映射"""
    import sys
    import re
    WORD_RE = re.compile('[a-zA-Z]+')
    index = {}
    
    with open("zen.txt", encoding='utf-8') as fp:
        for line_no, line in enumerate(fp, 1):
            for match in WORD_RE.finditer(line):
                word = match.group()
                column_no = match.start()+1
                location = (line_no, column_no)
                index.setdefault(word, []).append(location)
    
        # 以字母顺序打印出结果
        for word in sorted(index, key=str.upper):
            print(word, index[word])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这里我修改了正则表达式的内容,由于我们日常的文本很可能含有汉字,所以不能直接使用w+来提取,否则会把汉字的句子一句一句也提取出来
    enumerate()(参考enumerate)这里,生成一个带序号的列表,具体可以查看参考中的示例协助理解.
    for match in WORD_RE.finditer(line):根据设置好的规则([a-zA-Z]+)逐行查看,如果找到就记录下来,最后连接行列数,这里只有match.start()+1,是计算它的位置,及首字母出现在第几列,行数不需要,他在enmuerate就已经生成了.

    映射的弹性建查询

    如果查询到某个不存在的键值,我们希望它就给我们返回某一个默认的值,可以使用defaultdict这个类型,也可以在自定义的dict的子类中,通过特殊方法__missing__方法来实现,
    如果要自定义一个映射类型,通过集成collections.UserDict()类来实现

    字典的变种

    方法含义
    collections.OrdereDict添加建的时候会保持顺序,OrdereDict默认删除或者返回最后(最前)一个元素,感觉合适做队列或者栈
    collections.ChainMap容纳不同的映射对象
    collections.Counter一个计数器
    collections.UserDict用 python 实现标准的 dict
    UserDict比dict方便一些

    不可变的映射类型

    标准库中所有的映射类型都是可以改变的,MappingProxyType可以返回一个试图,这样就不会修改到原来的映射

  • 相关阅读:
    低代码平台的核心价值与优势
    【NI-DAQmx入门】校准
    ICCV 2023|Occ2Net,一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法...
    1658.将x减到0的最小操作数(滑动窗口)
    GBASE 8s cpu和共享内存配置参数
    【ES】一、ES入门及JavaAPI使用
    https——证书
    【数据结构初阶】线性表——顺序表(手撕顺序表)
    文件恢复软件哪个最好用?数据恢复软件,推荐这几款
    ftp端口号20和21的区别是什么?
  • 原文地址:https://blog.csdn.net/qq_17351161/article/details/127911568