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的更多相关文章

  1. 【Python学习笔记】Coursera课程《Python Data Structures》 密歇根大学 Charles Severance——Week6 Tuple课堂笔记

    Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week6 Tuple 10 Tuples 10.1 Tuples A ...

  2. 《Python Data Structures》Week5 Dictionary 课堂笔记

    Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week5 Dictionary 9.1 Dictionaries 字 ...

  3. 《Python Data Structures》 Week4 List 课堂笔记

    Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week4 List 8.2 Manipulating Lists 8 ...

  4. 《流畅的Python》 第一部分 序章 【数据模型】

    流畅的Python 致Marta,用我全心全意的爱 第一部分 序幕 第一章 Python数据模型 特殊方法 定义: Python解释器碰到特殊句法时,使用特殊方法激活对象的基本操作,例如python语 ...

  5. 流畅的python学习笔记:第二章

    第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' strin ...

  6. 流畅的python学习笔记:第一章

    这一章中作者简要的介绍了python数据模型,主要是python的一些特殊方法.比如__len__, __getitem__. 并用一个纸牌的程序来讲解了这些方法 首先介绍下Tuple和nametup ...

  7. 《流畅的Python》 A Pythonic Object--第9章

    Python的数据模型data model, 用户可以创建自定义类型,并且运行起来像内建类型一样自然. 即不是靠继承,而是duck typing. 支持用内建函数来创建可选的对象表现形式.例如repr ...

  8. 流畅的python学习笔记第七章:装饰器

    装饰器就如名字一样,对某样事物进行装饰过后然后返回一个新的事物.就好比一个毛坯房,经过装修后,变成了精装房,但是房子还是同样的房子,但是模样变了. 我们首先来看一个函数.加入我要求出函数的运行时间.一 ...

  9. 『流畅的Python』第1~4章笔记_数据结构、编码

    由于1~4章内容零散且基础,所以统计一下涉及到的内容,记录一下,方便查阅(第一张图右键新页面打开即可看到清晰大图)

  10. 流畅的python学习笔记:第九章:符合python风格的对象

    首先来看下对象的表现形式: class People():     def __init__(self,name,age):         self.name=name         self.a ...

随机推荐

  1. php 生成32位随机字符串 用于支付验证 用户注册

    //32位随机字符串 function randstrpay($length=32) { $rand=''; $randstr= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567 ...

  2. MySQL的数据库时间与电脑系统时间不一致

    问题描述 在开发的过程中遇到数据库的时间与电脑本身的系统时间不一致的状态. 首先查看数据库的时间是多少 select now(); select sysdate(); 执行上面的两个sql语句,看数据 ...

  3. [CF1070A]Find a Number_bfs

    Find a Number 题目链接:http://codeforces.com/problemset/problem/1070/A 数据范围:略. 题解: 因为$d$和$s$比较小可以搜. 这就很$ ...

  4. 方法重载,new,override

    方法重载:参数列表不一样,方法名字一样,包括泛型,和返回值无关 new: 复写,方法重载   overload  继承是对于普通方法和属性  复写 父类的 override:覆盖,重写 ,  对于抽象 ...

  5. Android虚拟机安装apk

    将apk放入platform-tools 打开虚拟机之后 进入该目录执行命令

  6. protobuf 序列化 使用

    protocol buff是一种协议,是谷歌推出的一种序列化协议 .Java序列化协议也是一种协议 两者的目的是,将对象序列化成字节数组,或者说是二进制数据 导包 <dependency> ...

  7. springcloud超简单的入门3--负载均衡

    上个文章的末尾说到,当有多个服务实例的时候,怎样来获取服务实例.但是,只是简单的通过get(0)来获取列表中的第一个实例来使用. 现实场景中,还需要写一个算法来实现负载均衡来决定每次使用的服务实例,而 ...

  8. 使用 IDEA 创建 maven 项目

    文章目录 第一步 第二步 第三步 目录结构的设置 看下 web.xml 配置文件 第一步 点击 maven : 勾选从模板创建 : 选择 webapp : 第二步 第三步 如果你自己对 maven 进 ...

  9. 前端开发 — HTML

    HTML HTML 超文本标记语言 HTML特征: 对换行和空格不敏感 空白折叠 1.1 HTML标签 标签也称为标记. 标签的种类: 1.双闭合标签 2.单闭合标签 1.1.1 head标签 met ...

  10. Once in a casino CodeForces - 1120B (暴力)

    大意: 给定两个字符串$a,b$, 每个字符为$0-9$, 每次操作将$a$中相邻两位加$1$或减$1$, 操作后每个数仍要为$0-9$, 求最少操作使$a$变成$b$. 先不考虑范围, 判断是否成立 ...