list
tuple
set
dict
这些基础的数据结构已经能够满足开发中的大多数需求,但是针对某些特殊场景,用基本的数据结构来实现,还是不够简便。为此,python内置了collections模块,在基本数据结构的基础上进行了扩展,提出了以下几种更具针对性的数据结构
>>> 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的元素,用法如下>>> a.most_common(2)[(2, 3), (1, 2)]>>> a.most_common()[-1](3, 1)
nameedtuple称之为命名元组,相当于为每个元素添加一个name属性,增加了代码的可读性,可以通过name来访问对应的元素,用法如下
>>> from collections import namedtuple>>> info = namedtuple('info', ['name', 'age'])>>> info('Andy', 22)info(name='Andy', age=22)>>> a = info('Andy', 22)>>> ainfo(name='Andy', age=22)>>> a.name'Andy'>>> a.age22>>> a[0]'Andy'>>> a[1]22
3. deque
deque是一个双向的队列,可以快速的在头部和尾部添加元素,用法如下
>>> from collections import deque>>> a = deque([1, 2, 3, 4])>>> a.append(5)>>> adeque([1, 2, 3, 4, 5])>>> a.appendleft(0)>>> a
deque([0, 1, 2, 3, 4, 5])>>> a.pop()5>>> adeque([0, 1, 2, 3, 4])>>> a.popleft()0>>> adeque([1, 2, 3, 4])>>> a.extend([5,6])>>> adeque([1, 2, 3, 4, 5, 6])>>> a.extendleft([-1,0])>>> adeque([0, -1, 1, 2, 3, 4, 5, 6])>>> a.insert(1, 'x')>>> adeque([0, 'x', -1, 1, 2, 3, 4, 5, 6])>>> a.remove('x')>>> adeque([0, -1, 1, 2, 3, 4, 5, 6])>>> a.index(2)3>>> a.reverse()>>> adeque([6, 5, 4, 3, 2, 1, -1, 0])>>> a.count(4)1>>> a.clear()>>> adeque([])
4. defaultdict
内置dict是没有默认值的,对于某个key,必须先定义其value之后才可以访问,最典型的就是计数
>>> a = dict()>>> a['a'] += 1Traceback (most recent call last): File "", line 1, in <module>KeyError: 'a'>>>>>>>>> a['a'] = 0>>> a['a'] += 1>>> a['a']1
每次声明默认值很麻烦,defaultdict的作用就是在声明dict时就设置value的默认值,经典的使用场景如下
>>
> from collections import defaultdict>>> a = defaultdict(list)>>> num = [1, 2, 3, 4, 5]>>> for i in num:... a['one'].append(i)...>>>>>> adefaultdict(<class 'list'>, {'one': [1, 2, 3, 4, 5]})
>>> a = defaultdict(dict)>>> a['one']['tow'] = 1>>> a['one']['three'] = 2>>> adefaultdict(<class 'dict'>, {'one': {'tow': 1, 'three': 2}})
5. OrderedDcit
在python3.7版本以前,字典key的顺序是乱序的,OrderedDcit的作用就是按照key插入的顺序来遍历字典,用法如下
>>> info = dict([('Andy', 24), ('John', 26), ('Rose', 22)])>>> for key in info:... print('name: {} age: {}'.format(key, info[key]))...name: John age: 26name: Andy age: 24name: Rose age: 22
>>> 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: 24name: John age: 26name: Rose age: 22
在python3.7之后,内置的dict默认就是按照key插入的顺序来记录的,不需要在借助OrderedDcit来实现上述操作了。
原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。
转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。
扫描下方二维码,关注我们,解锁更多精彩内容!