《流畅的Python》Data Structures--第3章 dict 和 set
dict and set
字典数据活跃在所有的python程序背后,即使你的源码里并没有直接使用它。
和dict有关的内置函数在模块builtins的__dict__内。
>>> __builtins__
<module 'builtins' (built-in)>
>>> __builtins__.__dict__
dict之所以在python中起到至关重要的作用,是因为Hash table。
本章内容:
- 常见方法
- 如何处理找不到的key
- dict变种
- set, frozenset
- Hash table 工作原理
- hash table的潜在影响。
Generic Mapping Types 泛映射类型
在python中只有一种标准映射类型: dict。下面说的是泛映射类型。
collections.abc模块提供了Mapping及其子类MutableMapping,用于formalize规范dict和相关类型的接口。

>>> from collections import *
>>> UserDict
<class 'collections.UserDict'>
>>> UserDict.__bases__
(<class 'collections.abc.MutableMapping'>,)
>>> UserDict.__class__
<class 'abc.ABCMeta'>
collections.UserDict的父类是MutableMapping。
标准库中所有的映射类型都是利用dict来实现。
key必须是hashable的数据类型。因为key必须是不可变的对象。
什么是Hashable? (点击链接,看文档说明)
- 如果说一个对象是hashable,那么在这个对象的整个生命中,它的hash value是不可变的。__hash__()
- 这个对象可以和其他对象进行比较。__eq__()
根据这个定义,str, bytes, 数值类都是hashable的。元祖的所有元素都是hashable的话,元祖也是hashable。
>>> a = {}
>>> hash(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> a = []
>>> hash(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> a = (1, 2, (1, 2))
>>> hash(a)
-1429464707349485113
>>> a = "hello"
>>> hash(a)
1326837820661389949
使用hash()可知一个对象是否是hashable。返回一个hash value,如果不可hashable,报错。
⚠️其实就是说这个对象能否作为一个字典的key 使用,或一个set的内部项使用。
什么是mapping(文档)
mapping术语指的就是一种支持任意键查找并实现了 Mapping 或 MutableMapping 抽象基类 中所规定方法的容器对象。dict, OrderedDict等。
stackoverflow上的回答:什么是一个映射对象?
a mapping object (an object that supports PyMapping_Keys() and PyObject_GetItem())
第一个函数,来自映射协议。第二个来自对象协议。
dict Comprehensions
list有推导,dict也有推导,一种更简化的代码写法。
后面的章节:(略过,未学习)
- 常用方法和setdefault
- 变种:OrderedDict, ChainMap, Counter
- 子类UserDict: 更适合自定义映射类。
3.8集合 Set Theory
set涉及set和frozenset。
Python历史中,比较新的概念,使用频率也比较低。
一个set的本质就是许多唯一对象的集合collection。它的基本用途就是去除重复。
>>> l = ['spam', 'spam', 'eggs']
>>> set(l)
{'eggs', 'spam'}
>>> list(set(l))
['eggs', 'spam']
⚠️set中的元素必须是hashable, 即体现出唯一性。
《流畅的Python》Data Structures--第3章 dict 和 set的更多相关文章
- 【Python学习笔记】Coursera课程《Python Data Structures》 密歇根大学 Charles Severance——Week6 Tuple课堂笔记
		Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week6 Tuple 10 Tuples 10.1 Tuples A ... 
- 《Python Data Structures》Week5 Dictionary 课堂笔记
		Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week5 Dictionary 9.1 Dictionaries 字 ... 
- 《Python Data Structures》 Week4 List 课堂笔记
		Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week4 List 8.2 Manipulating Lists 8 ... 
- 《流畅的Python》 第一部分 序章 【数据模型】
		流畅的Python 致Marta,用我全心全意的爱 第一部分 序幕 第一章 Python数据模型 特殊方法 定义: Python解释器碰到特殊句法时,使用特殊方法激活对象的基本操作,例如python语 ... 
- 流畅的python学习笔记:第二章
		第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' strin ... 
- 流畅的python学习笔记:第一章
		这一章中作者简要的介绍了python数据模型,主要是python的一些特殊方法.比如__len__, __getitem__. 并用一个纸牌的程序来讲解了这些方法 首先介绍下Tuple和nametup ... 
- 《流畅的Python》 A Pythonic Object--第9章
		Python的数据模型data model, 用户可以创建自定义类型,并且运行起来像内建类型一样自然. 即不是靠继承,而是duck typing. 支持用内建函数来创建可选的对象表现形式.例如repr ... 
- 流畅的python学习笔记第七章:装饰器
		装饰器就如名字一样,对某样事物进行装饰过后然后返回一个新的事物.就好比一个毛坯房,经过装修后,变成了精装房,但是房子还是同样的房子,但是模样变了. 我们首先来看一个函数.加入我要求出函数的运行时间.一 ... 
- 『流畅的Python』第1~4章笔记_数据结构、编码
		由于1~4章内容零散且基础,所以统计一下涉及到的内容,记录一下,方便查阅(第一张图右键新页面打开即可看到清晰大图) 
- 流畅的python学习笔记:第九章:符合python风格的对象
		首先来看下对象的表现形式: class People(): def __init__(self,name,age): self.name=name self.a ... 
随机推荐
- 基于MSP430G2231实现的频率计
			基于MSP430G2231实现的频率计 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 系列博客说明:此系列博客属于作者在大三大四阶段所储备的关于电子电路设计 ... 
- NAT-地址转换技术的配置
			(一)NAT的概念及工作原理 简单来讲,nat就是将私有网址转化为共有网址的技术.NAT通常部署在一个组织的网络出口位置,成为NAT网关.举个栗子,一段报文想离开私网,必须经过NAT网关将数据传输给公 ... 
- css实现可伸缩的搜索框
			效果图: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ... 
- jqGrid刷新不取消选中
			也就是说,刷新前选中的行,刷新后还是选中 var jqGrid = $("#jqGrid"); // 获取刷新前选中的行id var jqGridRowid=jqGrid.jqGr ... 
- 在搭建Hadoop集群环境时遇到的一些问题
			最近在学习搭建hadoop集群环境,在搭建的过程中遇到很多问题,在这里做一些记录.1. SSH相关的问题 问题一: ssh: connect to host localhost port 22: Co ... 
- 采用霍夫曼编码(Huffman)画出字符串各字符编码的过程并求出各字符编码 --多媒体技术与应用
			题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ... 
- 数据结构 -- 哈希表(hash table)
			简介 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ... 
- (二)javaweb开发的常见概念总结(来自那些年的笔记)
			目录 WEB开发相关知识 WEB服务器 Tomcat服务器 WEB应用程序 配置WEB应用 配置缺省的WEB应用 Web设置首页 web.xml文件 配置虚拟主机 配置https连接器 为我们的网站, ... 
- 剑指offer36:两个链表的第一个公共结点
			1 题目描述 输入两个链表,找出它们的第一个公共结点. 2 思路和方法 方法一: 用两个指针同时从两个链表的表头开始走,当走到自己的链表结尾的时候开始从另一个链表的表头开始向后走.终止条件就是两个指针 ... 
- WUSTOJ 1251: 报数游戏(Java)
			1251: 报数游戏 原题链接 Description n个人站成一行玩一个报数游戏.所有人从左到右编号为1到n.游戏开始时,最左边的人报1,他右边的人报2,编号为3的人报3,等等.当编号为n的人(即 ... 
