最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 说说在 Python 中如何使用 setDefault 方法提高效率

    正文概述 掘金(deniro)   2020-11-23   537

    1 从示例说起

    Luciano Ramalho 举了一个示例来说明 setDefault 方法相对于传统写法的高效性1

    import sys
    import re
    
    WORD_RE = re.compile(r'\w+')
    
    index = {}
    with open(sys.argv[1], 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)
    
                occurrences = index.get(word, [])
                occurrences.append(location)
                index[word] = occurrences
    
    for word in sorted(index, key=str.upper):
        print(word, index[word])
    

    运行结果:

    a [(1, 7), (1, 46), (1, 76), (1, 111), (3, 52), (3, 87), (19, 75), (19, 162)]
    about [(9, 83)]
    acknowledged [(1, 27)]
    agreed [(19, 241)]
    all [(9, 79)]
    and [(9, 63), (15, 23), (19, 171), (19, 198), (19, 326)]
    ……
    

    (1)enumerate() 函数

    enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。 语法:enumerate(sequence, [start=0])

    参数名说明
    sequence序列、迭代器或其他支持迭代的对象start下标起始位置

    To count off or name one by one; list

    因为入参是一篇文章,所以示例中的 enumerate 方法的 start 从 1 开始,即表示第一行。

    (2)正则 finditer() 方法

    finditer() 方法会返回一个MatchObject 类型的iterator2,所以需要一个个遍历。相比于 findall() 方法,使用 finditer() 方法可以省去外层所包裹的括号。

    示例中使用 finditer() 方法来查找每一行中的单词。column_no 表示单词所在的列索引。location 是一个包含行索引与列索引的元组,本质上是单词所在的坐标。

    (3)get() 方法设置默认值

    index 存放的是字典,key 为单词,值为单词在这篇文章中所出现的坐标列表。这里利用 python 字典的 get() 方法的第二个入参来指定默认值。语法为:dict.get(key, default=None)3

    如果单词 key 已经在字典中存在,则返回列表,否则返回一个空列表。然后把当然所确定的单词坐标放入该列表。

    (4)排序

    最后按照单词字母顺序打印出字典中的单词坐标列表。因为使用了 sorted 函数的 key=str.upper 属性,所以不分大小写, key=str.lower 效果与 key=str.upper 相同。key 用来指定元素的比较规则4

    2 优化

    其实以下三行我们可以利用 setDefault 方法在一行中实现:

    occurrences = index.get(word, [])
    occurrences.append(location)
    index[word] = occurrences
    

    优化后:

    index.setdefault(word, []).append(location)
    

    传递给 setdefault 方法的第一个参数是要检查的键。第二个参数需要设置的默认值。如果该键存在,该方法会直接返回键所对应的值5

    这样写的好处是:

    1. 代码简洁;
    2. 原来的示例需要查询两次。第一次是 index.get() 找出单词坐标列表;第二次是 index[word] 。优化后只需一次查询,因此提升了性能。

    参考资料

    【1】Luciano Ramalho (作者) 安道 , 吴珂 (译者).流畅的Python.人民邮电出版社,2017,140-142.

    【2】python re的findall和finditer.

    【3】Python 字典(Dictionary) get()方法.

    【4】Python sorted() 函数.

    【5】说说如何快速为 Python 字典设置新的值.


    起源地下载网 » 说说在 Python 中如何使用 setDefault 方法提高效率

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元