Python学习——collections系列

一 ,计数器(counter)

Counter是对字典类型的补充,用于追踪值得出现次数 ps:具备字典的所有功能 + 自己的功能

例:

>>> from collections import Counter 
>>> c = Counter('aadsassdsdads') 
>>> print(c) 
Counter({'a':4,'d':4,'s':5})

基本操作方法:

>>> c = Counter('abcdeabcdabcaba')

1.most_common(N)数量从大到小排列,获取前N个元素

>>> c.most_common(3) 
[('a', 5), ('b', 4), ('c', 3)]

2.sorted()列出所有不同的元素并排序

>>> sorted(c) 
>>> ['a','b','c','d','e']

3.转换成字符串

>>> ''.join(sorted(c.elements())) 
'aaaaabbbbcccdde'

4.取得元素重复次数的值

>>> c['a'] 
5

5.更新并添加元素重复次数

>>> for elem in 'shazam':         
    c[elem] += 1        #每个元素的次数加1 
>>> c['a'] 
7 
>>> print(c) 
Counter({'a':7,'b':4,'c':3,'d':2,'s':1,'h':1,'z':1,'m':1,'e':1})

6.update()更新计数器,其实就是增加;如果原来没有,则新建,如果有则加一

>>> d = Counter('simsalabim') 
>>> c.update(d) 
>>> c['a'] 
9 
>>> print(c) 
Countr({'a':9,'b':5,'s':3,'c':3,'m':3,'i':2,'d':2,'h':1,'l':1,'z':1,'e':1})

7.清空字典

>>> c.clear() 
>>> c 
Counter()

8.elements()取得计数器中的所有元素,注:此处非所有元素集合,而是包含所有元素集合的迭代器

>>> c = Counter('abcabc') 
>>> sorted(c.elements()) 
['a','a','b','b','c','c']

9.subtract()相减,原来的计数器中的每一个元素的数量减去后添加的元素的数量

>>> c = Counter('which') 
>>> print(c) 
Counter({'h':2,'c':1,'w':'1','i':1}) 
>>> c.subtract('watch') 
>>> c['h'] 
1 
>>> c['w'] 
0 
>>> print(c) 
Counter({'h':1,'i':1,'w':0,'c':0,'t':-1,'a':-1})

二, 有序字典(orderedDict)

orderdDict是对字典类型的补充,他记住了字典元素添加的顺序

>>> from collections import OrderedDict 
>>> dic = OrderedDict() 
>>> dic['k1'] = 'v1' 
>>> dic['k2'] = 'v2' 
>>> dic['k3'] = 'v3' 
>>> print(dic) 
OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])

基本操作方法:

1.取得字典所有的键

>>> dic.keys()

2.取得字典所有值

>>> dic.values()

3.items() 方法以列表返回可遍历的(键, 值) 元组数组

>>> dic.items() 
odict_items([('k1','v1'),('k2','v2'),('k3','v3')])

4.pop()方法,删除指定的键值

>>> dic.pop('k1') 
'v1' 
>>> print(dic) 
OrderedDict([('k2','v2'),('k3','v3')])

5.popitem()方法,默认删除字典最后一个元素

>>> dic.popitem() 
('k3','v3') 
>>> print(dic) 
odict_items([('k1','v1'),('k2','v2')])

6.move_to_end('k')方法将指定键值一道最后

>>> dic.move_to_end('k1') 
>>> print(dic) 
OrderedDict([('k2', 'v2'), ('k3', 'v3'),('k1', 'v1')])

7.update()更新字典

>>> dic.update({'k1':'v1111','k10':'v10'}) 
>>> print(dic) 
OrderedDict([('k1', 'v1111'), ('k2', 'v2'), ('k3', 'v3'),('k10','v10')])

三 , 默认字典(defaultdict)

defaultdict是对字典的类型的补充,他默认给字典的值设置了一个类型。

例:

集合 [11,22,33,44,55,66,77,88,99...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

即: {'k1': 大于66 , 'k2': 小于66}

原生字典解决方法:

 1 values = [11, 22, 33,44,55,66,77,88,99] 
 2 my_dict = {} 
 3 for value in  values:     
 4   if value>66:         
 5     if my_dict.has_key('k1'):             
 6       my_dict['k1'].append(value)         
 7     else:             
 8       my_dict['k1'] = [value]     
 9   else:         
10     if my_dict.has_key('k2'):             
11       my_dict['k2'].append(value)         
12     else:             
13       my_dict['k2'] = [value]

默认字典解决方法:

1 from collections import defaultdict 
2 values = [11, 22, 33,44,55,66,77,88,99] 
3 my_dict = defaultdict(list)                 #默认将字典设置成列表类型 
4 for value in  values:     
5   if value>66:         
6     my_dict['k1'].append(value)     
7   else:         
8     my_dict['k2'].append(value)

四,可命名元组(namedtuple)

根据nametuple可以创建一个包含tuple所有功能以及其他功能的类型。

from collections import namedtuple #创建(给元组命名)

>>> Mytuple = namedtuple('Mytuple',['x','y','z']) 
>>> obj = Mytuple(11,22,33) #通过x,y,z取得元组的值 
>>> obj.x 11 
>>> obj.y 22 
>>> obj.z 33

五,双向队列(deque)

一个线程安全的双向队列

from collections import deque #创建双向队列 
>>> d = deque() 
>>> d.append('1') 
>>> d.append('2')

1.append()向队列中插入数据(从右边插入)

>>> d.append('3') 
>>> print(d) 
deque(['1','2','3'])

2.appendleft()向队列中插入数据(从左边插入)

>>> d.appendleft('4') 
>>> print(d) 
deque(['4','1','2','3'])

3.clear()清空队列

>>> d.clear() 
>>> print(d) 
deque([])

4.count()计数

>>> d.append('1') 
>>> print(d) 
deque(['1','2','1']) 
>>> d.count('1') 
2

5.extend()从右边向队列添加额外元素

>>> d.extend(['qq','ww','ee']) 
>>> print(d) 
deque(['1','2','qq','ww','ee'])

6.extendleft()从左边向队列添加元素

>>> d.extendleft(['qq','ww','ee']) 
>>> print(d) 
deque(['qq','ww','ee','1','2'])

7.index()取得元素下标

>>> d.index('1') 
0

8.insert()指定位置插入元素

>>> d.insert(1,'nn') 
>>> print(d) 
deque(['1','nn','2'])

9.pop()从右边移除一个元素

>>> d.pop() 
2 
>>> print(d) 
deque(['1','nn'])

10.popleft()从左边移除一个元素

>>> d.popleft() 
1 
>>> print(d) 
deque(['nn'])

11.remove()移除指定元素

>>> d.remove('1') 
>>> print(d) 
deque(['2'])

12.reverse()反转队列

>>> print(d) 
deque(['1','2']) 
>>> d.reverse() 
>>> print(d) 
deque(['2','1'])

13.rotate()将右边指定的元素个数移到队列左边

>>> d.append('4') 
>>> d.append('5') 
>>> d.append('6') 
>>> print(d) 
deque(['1','2','3','4','5','6']) 
>>> d.rotate(3) 
>>> print(d) 
deque(['4','5','6','1','2','3'])

六,单向队列(先进先出 FIFO )

import queue # 创建单向队列 
>>> q = queue.Queue()

1.添加元素

>>> q.put('11') 
>>> q.put('22')

2.qsize()获取队列中元素个数

>>> q.qsize() 
2

3.get()取得元素(先进先出)

>>> q.get() 
11 
>>> q.get() 
22

原文发布于微信公众号 - 深度学习自然语言处理(zenRRan)

原文发表时间:2018-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏河湾欢儿的专栏

第九节 js里的new方法

要创建 Person 的新实例,必须使用 new 操作符。以这种方式调用构造函数实际上会经历以下 4 个步骤: (1) 创建一个新对象; (2) 将构造函...

14610
来自专栏猿人谷

C++重要知识点小结---3

C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:h...

17760
来自专栏深度学习之tensorflow实战篇

mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改

mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改 Mongodb并不提供Alter table这样的语句或者工具修...

34340
来自专栏全沾开发(huā)

数组的遍历你都会用了,那Promise版本的呢

28740
来自专栏编程坑太多

js数组的拷贝赋值复制-你真的懂?

39230
来自专栏xingoo, 一个梦想做发明家的程序员

复制控制---复制构造函数

复制构造函数 只有单个形参,而且该参数是对本类类型对象的引用。 主要用于: 1 根据另一个同类型的对象显示或隐式的初始化一个对象 string a = "abc...

20150
来自专栏奔跑的蛙牛技术博客

java基本程序设计

保护对象实例域,提供黑盒的概念保护数据域的安全,体现了面向对象思想。数据>算法的思想

10120
来自专栏我的技术专栏

java与C++变量初始化的对比

10930
来自专栏数据处理

python命名中下划线的含义

19520
来自专栏黑泽君的专栏

在不是Thread类的子类中,如何获取线程对象的名称呢?

我想要获取main方法所在的线程对象的名称,该怎么办呢?   遇到这种情况,Thread类就提供了一个很好玩的方法:     public static Thr...

10710

扫码关注云+社区

领取腾讯云代金券