python的字典和集合

dict类型可以说是python里模块的命名空间,实例的属性,函数的关键字参数都有其的参与。

set的实现也依赖于散列表

常见的字典方法:

如之前所述:

Container:
__contains__
Iterable:
__iter__
Sized:
__len__
Mapping:
__getitem__
__contains__
__eq__
__ne__
get
items
keys
values
MutableMapping
__Setitem__
__defitem__
clear
pop
popitem
setdefault
update

只有可散列的数据类型才能做mapping的键,根据文档里的说法:

The keys can be any object with __hash__() and __eq__() methods.

只有实现了__hash__()和__eq__()方法的才能作为键

不可变的序列都可视为可散列的,但是

hash((1,2,3))
Out[1]: 2528502973977326415
hash((1,2,[2,3]))
Traceback (most recent call last):
  File "<ipython-input-2-2a1f9780b624>", line 1, in <module>
    hash((1,2,[2,3]))
TypeError: unhashable type: 'list'

里面包含了可变序列,也是不可hash的

字典推导:

a = [1,2,3,4,5]
b = {index:element for index,element in enumerate(a)}
b
Out[5]: {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}

如何处理查找不到的键:

用setdefault处理找不到的键,可以避免tey/except方法

正常来说,一个字典里面没有的键:

b
Out[5]: {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}
b[5]
Traceback (most recent call last):
  File "<ipython-input-6-ca5d543a082a>", line 1, in <module>
    b[5]
KeyError: 5

会报错的,但是实现了setdefault方法呢?

b.setdefault(5,'default')
Out[7]: 'default'
b[5]
Out[8]: 'default'

这样的话,只需要检测b[5]是不是指定的值了。

当然还有更简单的,collections模块里的defaultdict或者自己定义一个dict的子类,在子类中实现__missing__方法

1.

d = collections.defaultdict(str)
d[2]
Out[21]: ''

在这里的输入值必须是可调用对象,比如str,list,set,int,string是不行的。

d = collections.defaultdict(23)
Traceback (most recent call last):
  File "<ipython-input-15-cc8c566b0851>", line 1, in <module>
    d = collections.defaultdict(23)
TypeError: first argument must be callable or None

2.

class NewDict(dict):
    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError(key)
        return self[str(key)]
    def get(self, key, default = None):
        try:
            return self[key]
        except KeyError:
            return default
    def __contains__(self, key):
        return key in self.keys() or str(key) in self.keys()

如果注释掉:

if isinstance(key, str):
            raise KeyError(key)

就会出现如下错误:

RecursionError: maximum recursion depth exceeded while calling a Python object

因为self[str(key)]会调用__getitem__,但是str(key)又不存在,于是就会报错

class NewDict(dict):
    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError(key)
        return str(key)
    def get(self, key, default = None):
        try:
            return self[key]
        except KeyError:
            return default
    def __contains__(self, key):
        return key in self.keys() or str(key) in self.keys()
a = NewDict()
a[2]
Out[40]: '2'

这样变相的实现了我们需要的值

标准库中字典的变种:

collections里的

OrderedDict:在添加键的时候会保持顺序,popitem是默认删除最

ChainMap:可容纳数个不同的映射对象,在进行键查找时会被作为一个整体查找

Counter:会给键准备一个计数器,用于计数键的更新次数

UesrDict:用纯python实现的dict,常用来方便用户继承

不可变映射类型,实际上可以理解为视图

MappingProxyType

集合:本质是许多唯一对象的聚集

交集&,并集|这些基本集合操作都有

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2017-08-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

php的字符串常用函数

1. str_word_count 统计单词个数 2. count_chars 得到字符串里面字符的有关情况 3. str_len 得到字符串长度,就是...

51360
来自专栏赵俊的Java专栏

记一道 Java 综合面试题

21720
来自专栏软件开发

JavaSE学习总结(八)—— 异常处理(Exception)

一、理解异常及异常处理的概念 异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。 异常不是错误 程序中关键的位置有异常处理,提高程序的稳定...

24390
来自专栏伪君子的梦呓

题解~按照特定的格式输出~C++做法

一共三行,第一行:位数 第二行: 用空格分开的每个数字,注意最后一个数字后没有空格 第三行: 按逆序输出这个数

6240
来自专栏闵开慧

总结5种比较高效常用的排序算法

1 概述     本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序、插入排序、归并排序、希尔排序、快速排序等。算法性...

43370
来自专栏有趣的django

第二章、深入类和对象

24100
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day06-知识点回顾与练习

Java基础-day06-知识点回顾与练习 1.求和案例 ? 实现代码: package StudentJavaSEday06; public class De...

33530
来自专栏androidBlog

笔试题—字符串常见的算法题集锦

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

22910
来自专栏无所事事者爱嘲笑

js小题目(持续更新)

18940
来自专栏Kevin-ZhangCG

总结五种常见的排序算法

    本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序、插入排序、归并排序、希尔排序、快速排序等。算法性能比较如下...

10640

扫码关注云+社区

领取腾讯云代金券