流畅的python--第三章

news/2024/9/22 3:38:04

字典

示例3-1-1字典推导式

示例3-1-2映射拆包

在调用函数时,不止一个参数可以使用**。但是所有键都要是字符串,而且在所有参数中,是唯一的(因为关键字参数不可重复)。

示例3-1-3使用|合并映射

合并映射遵循重复键情况下后键覆盖前键的规律。

可哈希

如果一个对象的哈希码在整个生命周期内永不改变(依托__hash__()方法),而且可与其他对象比较(依托__eq__方法),那么这个对象就是可哈希的。
数值类型以及不可变的扁平类型strbytes均是可哈希的。如果容器类型是不可变的,而且所含的对象全是可哈希的,那么容器类型自身也是可哈希的。 frozenset对象全部是可哈希的,因为按照定义,,每一个元素都必须是可哈希的。
仅当所有项均可哈希,tuple对象才是可哈希的。

一个对象的哈希码根据所用的Python版本和设备架构有所不同,如果出于安全考量而在哈希计算过程汇总加盐,那么哈希码也会发生变化。

插入或更新可变的值

根据python快速失败的原则,当键k不存在时,d[k]抛出错误。深谙python的人知道,如果觉得默认值比抛出KeyError更好,则可以使用d.get(k, default)
在目标目录编写脚本index0.py,即下面脚本。下载zen.txt放在目标目录。

执行脚本:python index0.py zen.txt

import re
import sysWORD_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() + 1location = (line_no, column_no)occurences = index.get(word, []) # 获取word出现的位置列表,如未找到,则返回[] ---1occurences.append(location) # 把新找到的位置追加到occurrences ---2index[word] = occurences # 把更新后的occurrences放入index字典 ---3for word in sorted(index, key=str.upper): # sorted函数的key参数不是调用str.upper方法,而是传入那个方法的引用,供sorted函数排序各个词,规范化输出。print(word, index[word])

结果显示:

注释1,2,3三行代码可以用一行替换index.setdefault(word, []).append(location),获取word出现的位置列表,如未找到,则设为[],setdefault返回该列表,可以直接更新,不用再搜索一次。

自动处理缺失的键

针对字典的键可能不存在,为了防止出现错误,会人为设置:第一种把普通的dict换为defaultdict;第二种是定义dict或其他映射类型的子类,实现__missing__方法。

import re
import sys
WORD_RE = re.compile(r'\w+')
index = collections.defaultdict(list) # 创建一个defaultdict对象,把default_factory设为list构造函数
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() + 1location = (line_no, column_no)index[word].append(location) # 如果index中没有word键,则调用default_factory生成缺失的值。这里生成一个空列表,赋值给index[word
],然后返回空列表
# 按字母表顺序显示
for word in sorted(index, key=str.upper):print(word, index[word])

__missing__方法


dict的变体

内置的dict也可以保留键的顺序。使用OrderedDict最主要原因是编写与早期Python版本兼容的代码。不过dictOrderedDict之间还有一些差异。

  • OrderedDict的等值检查考虑顺序
  • OrderedDictpopitem()方法签名不同,可通过一个可选参数指定移除哪一项。
  • OrderedDict多了一个move_to_end()方法,便于把元素的位置移到某一端。
  • 常规的dict主要用于执行映射操作,插入顺序是次要的
  • OrderedDict的目的是方便执行重新排序操作,空间利用率、迭代速度和更新操作的性能是次要的。
  • 从算法上看,OrderedDict处理频繁重新排序操作的效果比dict好,因此适合用于跟踪近期存取情况(例如在LRU缓存中)

collections.ChainMap

ChainMap实例存放一组映射,可作为一个整体来搜索。查找操作按照输入映射在构造函数调用中出现的顺序执行,一旦在某个映射中找到指定的键,旋即结束。

ChainMap实例不复制输入映射,而是存放映射的引用。ChainMap的更新或插入操作只影响第一个输入映射。

collections.Counter

这是一种对键计数的映射。更新现有的键,计数随之增加。可用于统计
可哈希对象的实例数量.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/31528.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

CodeGeeX 智能编程助手 6 项功能升级,在Visual Studio插件市场霸榜2周!

CodeGeeX是支持适配Visual Studio 2019的唯一一款国产智能辅助编程工具,已经在Visual Studio趋势上霸榜2周! CodeGeeX v1.0.4版本上线Visual Studio插件市场,带来了多项新功能和性能优化,提升编程体验。 新功能亮点速览: 一、侧边栏工具箱功能 v1.0.4版本中,CodeGeeX新增…

俄罗斯方块

原题链接 题解从小正方形到大正方形,有四个变化方向,分别是左上、右上、右下、左上。 分类讨论模拟即可 code #include<bits/stdc++.h> using namespace std; int main() {int n,x,y;cin>>n>>x>>y;puts("Yes");int flag=1;if(x==1){if(y==…

shell循环

echoecho -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符\r 光标移至行首,并且不换行\s 当前shell的名称,如bash\t 插入Tab键,制表符\n 输出换行\f 换行,但光标仍停留在原处\ 表示插入"\"本身转义\b 表示退格 不显示前一个字符\c 抑制更多的输出或不…

BiTCN:基于卷积网络的多元时间序列预测

前言 本文将详细介绍了BiTCN,这是2023年3月在《Parameter-efficient deep probabilistic forecasting》一文中提出的模型。通过利用两个时间卷积网络(TCN),该模型可以编码过去和未来的协变量,同时保持计算效率。 作者:Marco Peixeiro 本文转载自Deephub Imba 仅用于学术分享…

LSTM卷土重来!xLSTM:一举超越Mamba、Transformer!

前言 LSTM:这次重生,我要夺回 Transformer 拿走的一切。 本文转载自新智元 仅用于学术分享,若侵权请联系删除 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。 CV方向的准研究生们,未来三年如何度过? 招聘高光谱图像、语…

有奖调研 | OpenSCA开源社区用户调研问卷

为了更好地满足用户的需求,提升OpenSCA的实用性和易用性并促进社区的发展,我们决定发起一项用户调研活动,诚挚邀请您的参与。调研背景: 亲爱的OpenSCA开源社区用户,感谢您一路以来的支持与相伴。随着OpenSCA开源社区的不断发展,我们持续专注安全开发与开源治理实践,为全…

热力学基础

目录 目录前言1.热力学第一定律2.理想气体的热容3.理想气体四种过程的计算前言 其实是想直接开始写热力学基础的内容的,但是我发现这部分非常需要前置的气体动理论的支撑,因此先写完了气体动理论再开始写热力学基础相关内容。 鉴于这部分的内容量比较大,我也不打算再分多篇了…