Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


Python标准库collections模块

Python中最常用的几种数据结构是listtupledictset,但是当我们处理一些特定数据结构场景时就显得有些不方便或者效率低,不过Python丰富的类库已经帮我们解决了这个问题,今天要提到的就是collections库,该库里包含了许多非常有用的集合方法,熟练掌握这些方法可以让我们平时写代码时更加Pythonic而不是绞尽脑汁把简单的代码复杂化。

先来看看几个非常有用的collections库里的方法。

defaultdict()

defaultdict()方法其实有点类似于字典自带的setdefault()方法,setdefault()是在访问字典键是否存在的时候设定默认值。而defaultdict()方法则是先前设定好字典的缺失状态下的默认值,而这个传入参数是一个函数方法。

# 用form...import...方式导入,因为defaultdict方法属于collections类库。
from collections import defaultdict

test = defaultdict(int)

test["name"] = "anders"  
print(test["age"])

# 输出如下:
# 0

在上面这个例子中,把函数int作为参数传入,会按照int()调用,返回整数0。

因为,我们之前提到defaultdict的传入参数其实是一个方法函数,它返回赋给缺失键的值。那么下面我们自定义一个函数方法作为参数传入来看看不一样的效果。

from collections import defaultdict

def no_value():  
    return 'No Value!'

test = defaultdict(no_value)

test["name"] = "anders"  
print(test["age"])

# 输出如下:
# No Value!

上面这个例子中,我们定义了一个简单的函数方法,一旦调用该方法就会返回"No Value!",于是我们把这个函数方法当做参数传给defaultdict()方法,这样就设定了test字典键的默认值就是先前传入的函数方法的返回值,也就是"No Value!"。

既然参数是一个函数方法,那么当然我们也可以传入lambda表达式。

from collections import defaultdict

test = defaultdict(lambda: "No Value!")

test['name']

# 输出如下:
# No Value!

Counter()

Counter()是一个计数器,用来统计相关元素出现的个数。

from collections import Counter

test = ['a', 'b', 'c', 'a', 'a', 'b']

count = Counter(test)  
print(count)

# 输出如下:
# Counter({'a': 3, 'b': 2, 'c': 1})

还可以使用most_common()方法来以降序的方式返回一个元组列表

from collections import Counter

test = ['a', 'b', 'c', 'a', 'a', 'b']

count = Counter(test)  
print(count.most_common())

# 输出如下:
# [('a', 3), ('b', 2), ('c', 1)]

因为是以降序的方式排序,所以我们还可以给他传参,参数值为要返回的个数的数字,在下面例子中,假设我们输入1,它就显示当前的第一个元素值,也就列出了当前个数最多的统计数。

from collections import Counter

test = ['a', 'b', 'c', 'a', 'a', 'b']

count = Counter(test)  
print(count.most_common(1))

# 输出如下:
# [('a', 3)]

OrderedDict()

我们都知道每次在输出字典中键的顺序都是无序不可知的,但是如果我们使用OrderedDict()方法可以使字典变成有序字典,也就是可以记忆我们插入的元素顺序,然后从一个迭代器操作时可以以相同的顺序返回。

from collections import OrderedDict

test = OrderedDict({"Anders":3, "Mary": 2, "Tom":1})  
for k, v in test.items():  
    print(k, v)

# 输出如下:
# Anders 3
# Mary 2
# Tom 1

也就是说,你是如何在OrderedDict里定义的,它就记住了这个顺序当你下次遍历的时候依然保持这个顺序。

最近的文章

实用的(named tuple)命名元组

Python的创始人Guido van Rossum曾经提过一个建议:“不要过度的自己去构建数据结构,尽量去使用命名元组 (named tuple) 而不是对象,尽量使用简单的属性域,因为内置数…

Python, 技术博文详细阅读
更早的文章

使用setdefault方法处理字典缺失值

在处理字典集合的时候经常会去访问字典的键,由于场景有很多种比如有时候访问的字典键并不存在,那么如何很好的处理缺失值呢,这里要提到的就是字典的setdefault()方法,setdefault()方法其…

Python, 技术博文详细阅读
comments powered by Disqus