Page cover

Collections

基于我目前的学习经验,以下几种类型用的很多:

  • defaultdict (dict子类调用工厂函数来提供缺失值)

  • counter (用于计算可哈希对象的dict子类)

  • deque (类似于列表的容器,可以从两端操作)

  • namedtuple (用于创建具有命名字段的tuple子类的工厂函数)

defaultdict

基础概念

“defaultdict”是在名为“collections”的模块中定义的容器。它需要一个函数(默认工厂)作为其参数。默认情况下设置为“int”,即0.如果键不存在则为defaultdict,并返回并显示默认值。

其实就是一个查不到key值时不会报错的dict

应用实例

创建了一个叫person的字典,里面存储的key值为name,age,如果这时候尝试调用person['city'],会抛出KeyError错误,因为没有city这个键值:

person = {'name':'xiaobai','age':18}
print ("The value of key  'name' is : ",person['name'])
print ("The value of key  'city' is : ",person['city'])

Out: The value of key  'name' is :  xiaobai
Traceback (most recent call last):
  File "C:\Users\E560\Desktop\test.py", line 17, in <module>
    print ("The value of key  'city' is : ",person['city'])
KeyError: 'city'

用defaultdict再试试:

除此之外,我们还可以利用defaultdict创建时,传递参数为所有key默认value值这一特性,实现一些其他的功能,比如:

我们默认所有key对应的是一个list,自然就可以在赋值时使用list的append方法了。再比如这个例子:

Counter

基础概念

Counter是dict的子类,一个计数器

返回一个字典,key就是出现的元素,value就是该元素出现的次数

应用实例

配合dataframe也可以,当然,df有value_counts()方法:

Counter一般不会用于dict和set的计数,因为dict的key是唯一的,而set本身就不能有重复元素

现在我们也可以直接把在defaultdict例子中用过food元组拿来计数:

substract:

Deque

基础概念

在我们需要在容器两端的更快的添加和移除元素的情况下,可以使用deque. 我的个人理解是deque就是一个可以两头操作的容器,类似list但比列表速度更快

应用实例

deque的方法有很多,很多操作和list类似,也支持切片

deque最大的特点在于我们可以从两端操作:

再举几个常用的例子,定义一个deque时可以规定它的最大长度,deque和list一样也支持extend方法,方便列表拼接,但是deque提供双向操作:

现在d已经有9个元素了,规定的maxlen=9,这个时候如果从左边添加元素,会自动移除最右边的元素,反之也是一样:

deque还有很多其他的用法:

限制长度:

另外一个例子:网页浏览历史

Namedtuple

基础概念

名称元组。namedtuple可以将元组转换为方便的容器。使用namedtuple,我们不必使用整数索引来访问元组的成员。

我觉得可以把namedtuple 视为 不可变的 字典

应用实例

使用场景:读取csv,利用namedtuple 存储,后续添加hash_id 或者切换到dataframe

With class

Replacing Fields in Existing namedtuple Instances

Exploring Additional namedtuple Attributes

For loop namedtuple

Default Values

Returning Multiple Named Values From Functions

Reducing the Number of Arguments to Functions

namedtuple vs Data Class

Data Classes can be thought of as “mutable namedtuples with defaults.” (Source) However, it’d be more accurate to say that data classes are like mutable named tuples with type hints. The “defaults” part isn’t a difference at all because named tuples can also have default values for their fields. So, at first glance, the main differences are mutability and type hints.

Add fronzen=True, can't modify data any more

Subclassing namedtuple Classes

OrderedDict

基础概念

“OrderedDict” 本身就是一个dict,但是它的特别之处在于会记录插入dict的key和value的顺序

应用实例

如果删除一个key, OrderedDict的顺序不会发生变化:

Chainmap

ChainMap 提供 .new_child() 和 a .parents property属性:

Last updated

Was this helpful?