掌握Python中的“容器”,你只需要这一篇!

大家都知道,在现实生活中,“容器”指盛物品的器具;而在Python语言中,“容器”是一类存放一系列元素的数据结构,其中的元素能迭代的获取,并且可以通过in、not in、contains()等方法来判断某个元素是否存在于“容器”当中。接下来让我们看看Python中具体的实现。

1标准内建容器:list, dict, set, tuple

1.list

其中大家最熟悉的应该就是list,也就是列表。列表当中可以存放不同种类的数据,例如lst=[1, ‘list’,[1,2,3]],其中的每个元素都分配一个数字 - 它的索引,从0开始。我们可以往里面添加,删除数据,在某一个位置上赋值等各种操作,底层是以动态(元素个数可变)顺序表来实现的,当中存放的是数据的引用。
掌握Python中的“容器”,你只需要这一篇!
2.dict

dict-字典是一种以键值对方式存放一系列数据的类:d={key1:value1,key2:value2},其中的键确保是唯一的,且必须是不可变的,值可以取任何数据类型。有的小伙伴可能要问了,为什么要确保键是唯一的?这里就不得不说它的背后实现:散列表(或者哈希表)。散列表最重要的是散列函数,散列函数通过键来计算元素实际的下标。这样在查找元素时,我们通过键只需O(1)的时间就能得到所需的数据。如果键是可变的,那么键和值的关系有可能变成多对一,这样查找元素的时间可能会达到O(n),这样就违背了散列表的初衷了。
掌握Python中的“容器”,你只需要这一篇!
3.set

set-集合一个无序的不重复元素序列:s= set([1,2,3]) 或者 s = {1,2,3},其实它的实现原理跟字典一样,相当于值为空的字典,这里就不展开讲了。注意,如果想得到一个空集合应该是s = set(), 不能使用s = {}这种方式,因为这样得到的其实是一个字典。

4.tuple

tuple-元组本质上就是顺序表,不可修改不可扩容,只读。与列表类似,不同之处在于元组的元素不能修改。因此元组有两种使用方式:

1.基于其不可变的特性,我们可以把它用于没有字段名的记录,例如经纬度、地理 位置信息以及其他不变的或者需要保护的实际的记录:coordinates = (33.9425, -118.408056)。这里有一个需要注意的点,定义只有一个元素的元组时,一定要记得在后面加上逗号,否则括号在Python解释器中是不起作用的:t = (1,)。

2.单纯地作为不可变的列表,除了跟增减元素相关的方法之外,元组支持列表的其他所有方法。还有一个例外,元组没有 reversed 方 法,但是这个方法只是个优化而已,reversed(my_tuple)这个用法在 没有 reversed 的情况下也是合法的。

2额外的容器

Python标准库中有collections这一模块,实现了特定目标的容器,以提供Python标准内建容器dict,list,set 和 tuple的替代选择。
掌握Python中的“容器”,你只需要这一篇!
1.namedtuple

namedtuple是一个工厂函数,我们调用这个函数时,实际上会创建一个类:
掌握Python中的“容器”,你只需要这一篇!
用 namedtuple 构建的类的实例所消耗的内存跟元组是一样的,因为字段名都被存在对应的类里面。这个实例跟普通的对象实例比起来也要小一些,因为Python不会用 dict 来存放这些实例的属性。也就是说用元组存放类实例的属性值,当我们去打印属性值时,会直接从元组的对应位置取值,有兴趣的可以看看相关源码。
掌握Python中的“容器”,你只需要这一篇!
注意,namedtuple本质上是对元组的继承,所以用索引获取值等方法都是可以使用的。除此之外,_fields 属性是一个包含这个类所有字段名称的元组,_asdict() 把具名元组以 collections.OrderedDict 的形式返回。
掌握Python中的“容器”,你只需要这一篇!
掌握Python中的“容器”,你只需要这一篇!
2.OrderedDict

提到OrderedDict,顾名思义,它在添加键的时候会保持顺序,是用双链表的思想去实现的。此外,它占用的空间大约是普通字典的两倍,因为它使用了额外的一个字典去记录元素前后的节点,以此来记录顺序。所以我们在使用时要格外注意它对内存的占用。
掌握Python中的“容器”,你只需要这一篇!
掌握Python中的“容器”,你只需要这一篇!
3.defaultdict

另一个比较重要的是defaultdict,在实例化一个 defaultdict 的时候,需要给构造方法提供一个可调用对象,这个可调用对象会在 getitem 碰到找不到的键的时候被调用,让 getitem 返回某种默认值,举一个例子:
掌握Python中的“容器”,你只需要这一篇!
掌握Python中的“容器”,你只需要这一篇!
4.Counter

还有一个比较有意思的是Counter。这个类型会给键准备一个整数计数器。每次更新一个键的时候都会增加这个计数器。所以这个类型可以用来给可散列表对象计数,或者是当成多重集来用——多重集合就是集合里的元素可以出现不止一次。Counter实现了 + 和 - 运算符用来合并记录,还有像most_common([n]) 这类很有用的方法。most_common([n]) 会按照次序返回映射里最常见的 n 个键和它们的计数。
掌握Python中的“容器”,你只需要这一篇!
掌握Python中的“容器”,你只需要这一篇!
此外,collectiions库中还有一些不常用的类,大家可以查看官方文档详细了解相关的使用方法:https://docs.python.org/zh-cn/3/library/collections.html。

以上就是Python中常用的容器类型,当中有些类型能够提高效率,节省空间;另外说句题外话,数据结构对python的学习也是有帮助的哦。最后希望大家都能成为Python大神! 更多干货内容,欢迎关注公众号:知了python