前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用python collections模块中提供的数据结构

使用python collections模块中提供的数据结构

作者头像
生信修炼手册
发布2020-05-25 15:45:30
4220
发布2020-05-25 15:45:30
举报
文章被收录于专栏:生信修炼手册生信修炼手册

欢迎关注”生信修炼手册”!

python内置的基本数据结构有以下几种

  1. list
  2. tuple
  3. set
  4. dict

这些基础的数据结构已经能够满足开发中的大多数需求,但是针对某些特殊场景,用基本的数据结构来实现,还是不够简便。为此,python内置了collections模块,在基本数据结构的基础上进行了扩展,提出了以下几种更具针对性的数据结构

1. Counter

Counter用于对元素进行计数,用法如下

代码语言:javascript
复制
>>> from collections import Counter
>>> Counter([1, 2, 3, 2, 2, 1])
Counter({2: 3, 1: 2, 3: 1})
>>> a = Counter([1, 2, 3, 2, 2, 1])
# 类似字典的访问方式
>>> a[2]
3
>>> a[1]
2
>>> a[3]
1

利用Counter,可以方便的提取topN的元素,用法如下

代码语言:javascript
复制
# 提取出现次数最多的两个元素
>>> a.most_common(2)
[(2, 3), (1, 2)]
# 提取出现次数最少的元素
>>> a.most_common()[-1]
(3, 1)

2. namedtuple

nameedtuple称之为命名元组,相当于为每个元素添加一个name属性,增加了代码的可读性,可以通过name来访问对应的元素,用法如下

代码语言:javascript
复制
>>> from collections import namedtuple
>>> info = namedtuple('info', ['name', 'age'])
>>> info('Andy', 22)
info(name='Andy', age=22)
>>> a = info('Andy', 22)
>>> a
info(name='Andy', age=22)
>>> a.name
'Andy'
>>> a.age
22
>>> a[0]
'Andy'
>>> a[1]
22

3. deque

deque是一个双向的队列,可以快速的在头部和尾部添加元素,用法如下

代码语言:javascript
复制
>>> from collections import deque
>>> a = deque([1, 2, 3, 4])
# 右侧添加一个元素
>>> a.append(5)
>>> a
deque([1, 2, 3, 4, 5])
# 左侧添加一个元素
>>> a.appendleft(0)
>>> a
deque([0, 1, 2, 3, 4, 5])
# 右侧删除一个元素
>>> a.pop()
5
>>> a
deque([0, 1, 2, 3, 4])
# 左侧删除一个元素
>>> a.popleft()
0
>>> a
deque([1, 2, 3, 4])
# 右侧添加多个元素
>>> a.extend([5,6])
>>> a
deque([1, 2, 3, 4, 5, 6])
# 左侧添加多个元素
>>> a.extendleft([-1,0])
>>> a
deque([0, -1, 1, 2, 3, 4, 5, 6])
# 在指定的下标处,插入元素
>>> a.insert(1, 'x')
>>> a
deque([0, 'x', -1, 1, 2, 3, 4, 5, 6])
# 删除指定的元素
>>> a.remove('x')
>>> a
deque([0, -1, 1, 2, 3, 4, 5, 6])
# 查找特定元素,返回下标
>>> a.index(2)
3
# 将队列逆序排列
>>> a.reverse()
>>> a
deque([6, 5, 4, 3, 2, 1, -1, 0])
# 统计指定元素出现的次数
>>> a.count(4)
1
# 清空队列
>>> a.clear()
>>> a
deque([])

4. defaultdict

内置dict是没有默认值的,对于某个key,必须先定义其value之后才可以访问,最典型的就是计数

代码语言:javascript
复制
# key不存在,直接对其值进行加1操作,会报错
>>> a = dict()
>>> a['a'] += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'a'
>>>
# 先声明一个值,再进行加1 操作,正常执行
>>>
>>> a['a'] = 0
>>> a['a'] += 1
>>> a['a']
1

每次声明默认值很麻烦,defaultdict的作用就是在声明dict时就设置value的默认值,经典的使用场景如下

代码语言:javascript
复制
# 创建值为列表的字典
# 表明value的默认值为list
>>> from  collections import defaultdict
>>> a = defaultdict(list)
>>> num = [1, 2, 3, 4, 5]
>>> for i in num:
...     a['one'].append(i)
...
>>>
>>> a
defaultdict(<class 'list'>, {'one': [1, 2, 3, 4, 5]})

# 创建双层字典
# 命名value的默认值为dict
>>> a = defaultdict(dict)
>>> a['one']['tow'] = 1
>>> a['one']['three'] = 2
>>> a
defaultdict(<class 'dict'>, {'one': {'tow': 1, 'three': 2}})

5. OrderedDcit

在python3.7版本以前,字典key的顺序是乱序的,OrderedDcit的作用就是按照key插入的顺序来遍历字典,用法如下

代码语言:javascript
复制
# python 3.5
# key 乱序
>>> info = dict([('Andy', 24), ('John', 26), ('Rose', 22)])
>>> for key in info:
...     print('name: {} age: {}'.format(key, info[key]))
...
name: John age: 26
name: Andy age: 24
name: Rose age: 22

# OrderedDict
# 按照key插入的顺序
>>> order_info = collections.OrderedDict([('Andy', 24), ('John', 26), ('Rose', 22)])
>>> for key in order_info:
...     print('name: {} age: {}'.format(key, info[key]))
...
name: Andy age: 24
name: John age: 26
name: Rose age: 22

在python3.7之后,内置的dict默认就是按照key插入的顺序来记录的,不需要在借助OrderedDcit来实现上述操作了。

·end·

—如果喜欢,快分享给你的朋友们吧—

原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!

本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档