python标准库之collections

简介:

引言

python为我们提供了5种基本的数据结构:list, tuple, dict, set,字符串;

有时候我们需要维护一个有序的dict。所以这个时候我们就要用到Python标准库为我们提供的collections包了,它提供了多个有用的集合类,熟练掌握这些集合类,不仅可以让我们让写出的代码更加pythonic,也可以提高我们程序的运行效率。

defaultdict:

defaultdict(default_factory)在普通的dict(字典)之上添加了default_factory,使得key(键)不存在时会自动生成相应类型的value(值),default_factory参数可以指定成list, set, int等各种合法类型。

1
2
>>>  from  collections  import  defaultdict
>>> s  =  [( 'red' 1 ), ( 'blue' 2 ), ( 'red' 3 ), ( 'blue' 4 ), ( 'red' 1 ), ( 'blue' 4 )]

例1:将default_factory设置为list

我们现在有上面这样一组list(列表),虽然我们有6组数据,但是仔细观察后发现其实我们只有两种color(颜色),但是每一个color对应多个值。现在我们想要将这个list转换成一个dict(字典),这个dict的key(键)对应一种color,dict的value(值)设置为一个list存放color对应的多个值。我们可以使用defaultdict(list)来解决这个问题。

1
2
3
4
5
6
7
# d可以看作一个dict(字典),dict的value是一个list(列表)
>>> d  =  defaultdict( list )
>>>  for  k,v  in  s:
...     d[k].append(v)
...
>>> d
defaultdict(< class  'list' >, { 'blue' : [ 2 4 4 ],  'red' : [ 1 3 1 ]})

例2:将default_factory设置为set

上面这个例子中有一些不完美的地方,比如说{‘blue’: [2, 4, 4], ‘red’: [1, 3, 1]}这个defaultdict中blue颜色中包含两个4,red颜色中包含两个1,但是我们不希望含有重复的元素,这个时候可以考虑使用defaultdict(set)来解决这个问题。set(集合)相比list(列表)的不同之处在于set中不允许存在相同的元素。

1
2
3
4
5
6
>>> d  =  defaultdict( set )
>>>  for  k,v  in  s:
...     d[k].add(v)
...
>>> d
defaultdict(< class  'set' >, { 'blue' : { 2 4 },  'red' : { 1 3 }})

例3:将default_factory设置为int

通过使用defaultdict(int)的形式我们来统计一个字符串中每个字符出现的个数。

1
2
3
4
5
6
7
>>> s  =  'hello world'
>>> d  =  defaultdict( int )
>>>  for  in  s:
...     d[k]  + =  1
...
>>> d
defaultdict(< class  'int' >, { 'o' 2 'h' 1 'w' 1 'l' 3 ' ' 1 'd' 1 'e' 1 'r' 1 })

OrderedDict:

我们知道默认的dict(字典)是无序的,但是在某些情形我们需要保持dict的有序性,这个时候可以使用OrderedDict,它是dict的一个subclass(子类),但是在dict的基础上保持了dict的有序型,下面我们来看一下使用方法。

1
2
3
>>>  from  collections  import  OrderedDict
# 无序的dict
>>> d  =  { 'banana' 3 'apple' 4 'pear' 1 'orange' 2 }

例1:这是一个无序的dict(字典),现在我们可以使用OrderedDict来让这个dict变得有序。

1
2
3
4
5
6
7
8
9
# 将d按照key来排序
>>> OrderedDict( sorted (d.items(), key = lambda  t: t[ 0 ]))
OrderedDict([( 'apple' 4 ), ( 'banana' 3 ), ( 'orange' 2 ), ( 'pear' 1 )])
# 将d按照value来排序
>>> OrderedDict( sorted (d.items(), key = lambda  t: t[ 1 ]))
OrderedDict([( 'pear' 1 ), ( 'orange' 2 ), ( 'banana' 3 ), ( 'apple' 4 )])
# 将d按照key的长度来排序
>>> OrderedDict( sorted (d.items(), key = lambda  t:  len (t[ 0 ])))
OrderedDict([( 'pear' 1 ), ( 'apple' 4 ), ( 'orange' 2 ), ( 'banana' 3 )])

例2:使用popitem(last=True)方法可以让我们按照LIFO(先进后出)的顺序删除dict中的key-value,即删除最后一个插入的键值对,如果last=False就按照FIFO(先进先出)删除dict中key-value。

1
2
3
4
5
6
7
8
9
10
11
>>> d  =  { 'banana' 3 'apple' 4 'pear' 1 'orange' 2 }
# 将d按照key来排序
>>> d  =  OrderedDict( sorted (d.items(), key = lambda  t: t[ 0 ]))
>>> d
OrderedDict([( 'apple' 4 ), ( 'banana' 3 ), ( 'orange' 2 ), ( 'pear' 1 )])
# 使用popitem()方法来移除最后一个key-value对
>>> d.popitem()
( 'pear' 1 )
# 使用popitem(last=False)来移除第一个key-value对
>>> d.popitem(last = False )
( 'apple' 4 )

例3:使用move_to_end(key, last=True)来改变有序的OrderedDict对象的key-value顺序,通过这个方法我们可以将排序好的OrderedDict对象中的任意一个key-value插入到字典的开头或者结尾。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> d  =  OrderedDict.fromkeys( 'abcde' )
>>> d
OrderedDict([( 'a' None ), ( 'b' None ), ( 'c' None ), ( 'd' None ), ( 'e' None )])
# 将key为b的key-value对移动到dict的最后
>>> d.move_to_end( 'b' )
>>> d
OrderedDict([( 'a' None ), ( 'c' None ), ( 'd' None ), ( 'e' None ), ( 'b' None )])
>>> ''.join(d.keys())
'acdeb'
# 将key为b的key-value对移动到dict的最前面
>>> d.move_to_end( 'b' , last = False )
>>> ''.join(d.keys())
'bacde'

Counter:

例1:Counter也是dict的一个subclass,它是一个无序容器,可以看做一个计数器,用来统计相关元素出现的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>>  from  collections  import  Counter
>>> cnt  =  Counter()
# 统计列表中元素出现的个数
>>>  for  word  in  [ 'red' 'blue' 'red' 'green' 'blue' 'blue' ]:
...  cnt[word]  + =  1
...
>>> cnt
Counter({ 'blue' 3 'red' 2 'green' 1 })
# 统计字符串中元素出现的个数
>>> cnt  =  Counter()
>>>  for  ch  in  'hello' :
...     cnt[ch]  =  cnt[ch]  +  1
...
>>> cnt
Counter({ 'l' 2 'o' 1 'h' 1 'e' 1 })

例2:使用elements()方法按照元素的出现次数返回一个iterator(迭代器),元素以任意的顺序返回,如果元素的计数小于1,将忽略它。

1
2
3
4
5
6
7
8
9
10
>>> c  =  Counter(a = 4 , b = 2 , c = 0 , d = - 2 )
>>> c
Counter({ 'a' 4 'b' 2 'c' 0 'd' - 2 })
>>> c.elements()
<itertools.chain  object  at  0x7fb0a069ccf8 >
>>>  next (c)
'a'
# 排序
>>>  sorted (c.elements())
[ 'a' 'a' 'a' 'a' 'b' 'b' ]

例3:使用most_common(n)返回一个list, list中包含Counter对象中出现最多前n个元素。

1
2
3
4
5
>>> c  =  Counter( 'abracadabra' )
>>> c
Counter({ 'a' 5 'b' 2 'r' 2 'd' 1 'c' 1 })
>>> c.most_common( 3 )
[( 'a' 5 ), ( 'b' 2 ), ( 'r' 2 )]

namedtuple:

使用namedtuple(typename, field_names)命名tuple中的元素来使程序更具可读性。

1
2
3
4
5
6
7
8
9
>>>  from  collections  import  namedtuple
>>> Point  =  namedtuple( 'PointExtension' , [ 'x' 'y' ])
>>> p  =  Point( 1 2 )
>>> p.__class__.__name__
'PointExtension'
>>> p.x
1
>>> p.y
2

本文转自激情燃烧的岁月博客51CTO博客,原文链接http://blog.51cto.com/liuzhengwei521/1919825如需转载请自行联系原作者

weilovepan520
相关文章
|
2天前
|
算法 Python
请解释Python中的关联规则挖掘以及如何使用Sklearn库实现它。
使用Python的mlxtend库,可以通过Apriori算法进行关联规则挖掘。首先导入TransactionEncoder和apriori等模块,然后准备数据集(如购买行为列表)。对数据集编码并转换后,应用Apriori算法找到频繁项集(设置最小支持度)。最后,生成关联规则并计算置信度(设定最小置信度阈值)。通过调整这些参数可以优化结果。
25 9
|
17天前
|
存储 缓存 JavaScript
python实战篇:利用request库打造自己的翻译接口
python实战篇:利用request库打造自己的翻译接口
29 1
python实战篇:利用request库打造自己的翻译接口
|
21天前
|
存储 开发者 Python
Python中的collections模块与UserDict:用户自定义字典详解
【4月更文挑战第2天】在Python中,`collections.UserDict`是用于创建自定义字典行为的基类,它提供了一个可扩展的接口。通过继承`UserDict`,可以轻松添加或修改字典功能,如在`__init__`和`__setitem__`等方法中插入自定义逻辑。使用`UserDict`有助于保持代码可读性和可维护性,而不是直接继承内置的`dict`。例如,可以创建一个`LoggingDict`类,在设置键值对时记录操作。这样,开发者可以根据具体需求定制字典行为,同时保持对字典内部管理的抽象。
|
2天前
|
索引 Python
如何在Python中使用Pandas库进行季节性调整?
在Python中使用Pandas和Statsmodels进行季节性调整的步骤包括:导入pandas和seasonal_decompose模块,准备时间序列DataFrame,调用`seasonal_decompose()`函数分解数据为趋势、季节性和残差,可选地绘制图表分析,以及根据需求去除季节性影响(如将原始数据减去季节性成分)。这是对时间序列数据进行季节性分析的基础流程。
18 2
|
1天前
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by=&#39;A&#39;, ascending=False)`。`rank()`函数用于计算排名,如`df[&#39;A&#39;].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=[&#39;A&#39;, &#39;B&#39;], ascending=[True, False])`和分别对&#39;A&#39;、&#39;B&#39;列排名。
12 2
|
2天前
|
Python
如何使用Python的Pandas库进行数据缺失值处理?
Pandas在Python中提供多种处理缺失值的方法:1) 使用`isnull()`检查;2) `dropna()`删除含缺失值的行或列;3) `fillna()`用常数、前后值填充;4) `interpolate()`进行插值填充。根据需求选择合适的方法处理数据缺失。
29 9
|
4天前
|
缓存 自然语言处理 数据处理
Python自然语言处理面试:NLTK、SpaCy与Hugging Face库详解
【4月更文挑战第16天】本文介绍了Python NLP面试中NLTK、SpaCy和Hugging Face库的常见问题和易错点。通过示例代码展示了如何进行分词、词性标注、命名实体识别、相似度计算、依存关系分析、文本分类及预训练模型调用等任务。重点强调了理解库功能、预处理、模型选择、性能优化和模型解释性的重要性,帮助面试者提升NLP技术展示。
22 5
|
4天前
|
Python
如何使用Python的Plotly库创建交互式图表?
Plotly是Python的交互式图表库,支持多种图表类型,如折线图、散点图、柱状图。使用步骤包括安装库、导入模块、准备数据、创建图表对象、添加数据和设置属性,最后显示或保存图表。
16 6
|
4天前
|
机器学习/深度学习 数据采集 算法
请解释Python中的Sklearn库以及它的主要用途。
Sklearn是Python的机器学习库,提供数据预处理、特征选择、分类回归、聚类、模型评估和参数调优等工具。包含监督和无监督学习算法,如SVM、决策树、K-means等,并提供样例数据集便于实践。它是进行机器学习项目的重要资源。
13 1
|
4天前
|
XML 数据采集 自然语言处理
请解释Python中的BeautifulSoup库以及它的主要用途。
BeautifulSoup是Python的HTML/XML解析库,用于数据提取和网页抓取。它提供树形结构解析文档,支持查找、访问和修改元素。主要用途包括网页抓取、数据清洗、自动化测试、内容生成、网站开发及与其他库集成,如Requests和Scrapy。适用于各种数据处理场景。
9 1