Pyhton:collections

1.计数器

import collections

c=collections.Counter("aasddjjchhjxhcjxhcxj")     #统计序列中元素出现的个数
print c
"
结果:
Counter({'j': 5, 'h': 4, 'c': 3, 'x': 3, 'a': 2, 'd': 2, 's': 1})  收集字母在序列中出现的次数"
######################################################
print c.most_common(3) #[('j', 5), ('h', 4), ('c', 3)] #获取次数前三的
######################################################
print c.elements()  #<itertools.chain object at 0x00000000037B8358> 这是个迭代器,取所有元素,
for i in c.elements():
    print i,   #结果:a a c c c d d h h h h j j j j j s x x x
print
######################################################
for key,value in c.items():   #循环的时候跟字典一样
    print (key,value),   #结果:('a', 2) ('c', 3) ('d', 2) ('h', 4) ('j', 5) ('s', 1) ('x', 3)
######################################################

print c
"""
结果:
Counter({'j': 5, 'h': 4, 'c': 3, 'x': 3, 'a': 2, 'd': 2, 's': 1})
"""
######################################################
"""
c.subtract('abcd') #相减,原来的计数器中的每一个元素的数量减去后添加的元素的数量   存在就减,不存在减成-1也得减
"""
c.subtract('abcd')     
print c
"""
结果
Counter({'j': 5, 'h': 4, 'x': 3, 'c': 2, 'a': 1, 'd': 1, 's': 1, 'b': -1})
"""
######################################################
"""
c.update(iter)
在原有的对象的基础想更新这个对象,重新对这个对象中元素出现的个数进行统计
"""
c.update(['a','erer','c'])
print c   
#结果:Counter({'j': 5, 'c': 4, 'h': 4, 'a': 3, 'x': 3, 'd': 2, 'erer': 1, 's': 1})

2.有序字典

#由于字典是无序的,我们可以借助列表来讲他变成有序
dict={'k1':'v1','k2','v2'...,'kn':'vn}
由于在运行的过程中字典会变得无序,使得字典内部的元素的排列顺序变得有序,因此有了下面这个想法
list=['k1','k2','k3',...,'kn']
for i in list:
    print dict[i]         #此时此刻就是按照顺序来取的了
代码实现
>>> d={'k1':'v1','k2':'v2','k3':'v3','k4':'v4'}
>>> d
{'k3': 'v3', 'k2': 'v2', 'k1': 'v1', 'k4': 'v4'}
>>> l=['k1','k2','k3','k4']
>>> l
['k1', 'k2', 'k3', 'k4']
>>> for i in l:
...     print d[i],
... 
v1 v2 v3 v4
>>> 

用上面的方法虽然能够实现我们想要的功能,但是这不是最好的办法,同时更新字典和列表还是比较麻烦。python大法好,进阶版

dic=collections.OrderedDict()#在这里声明对象后,就可以直接用有序字典了
dic['k1']='v1'
dic['k2']='v2'
dic['k3']='v3'
dic['k4']='v4'  
print dic
"""
结果:
OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', 'v4')])
"""
#########################################################
print dic.popitem(last=True)  #默认删除最后一个,并返回这个值
"结果:('k4', 'v4')"
print dic
"""
结果:
OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
"""
#########################################################
print dic.pop('k2')   #删除指定的元素,并返回
print dic
#########################################################
dic.update({'k1':'vk','k10':'v10'})  #有就更新覆盖,没有就添加
print dic  
#结果:OrderedDict([('k1', 'vk'), ('k3', 'v3'), ('k10', 'v10')])

3.默认字典

默认字典是怎么回事??一般用在什么地方???

比如下面这个场景:
 list=[11,45,67,45,87,12,99,123,25,77,33]
 dict{'k1':大于60的,'k2':'小于60的'}
 把列表中的元素取出来放入到dict对应的value中
在不知道默认字典之前
 d={}
 l=[11,45,67,45,87,12,99,123,25,77,33]
 for i in l:
     if i<60:
         if d.has_key('k1'):
             d['k1'].append(i)
         else:
             d['k1']=[i]
     else:
        if d.has_key('k2'):
             d['k2'].append(i)
         else:
             d['k2']=[i]
 print d
 结果:
 {'k2': [67, 87, 99, 123, 77], 'k1': [11, 45, 45, 12, 25, 33]}

为了简化,python引入了collections模块中的defaultdict()


#现在:
my_d=collections.defaultdict(list)
for i in l:
    if i<60:
        my_d['k1'].append(i)
    else:
        my_d['k2'].append(i)

print my_d
{'k2': [67, 87, 99, 123, 77], 'k1': [11, 45, 45, 12, 25, 33]}

分析:

>>> my_d=collections.defaultdict(list)#生成的字典value是一个列表
>>> type(my_d)
<type 'collections.defaultdict'>
>>> my_d['k1'].append(1) #既然是列表那么就可以使用列表的内建方法  
>>> my_d['k1'].append(3)
>>> my_d
defaultdict(<type 'list'>, {'k1': [1, 3]})
>>> my_d['k1'][1]
3
>>> 

同样的道理
>>> my_d2=collections.defaultdict(dict)#生成的字典value是一个字典类型
>>> my_d2['k1']['v2']=3
>>> my_d2['k1']['v3']=7
>>> my_d2
defaultdict(<type 'dict'>, {'k1': {'v2': 3, 'v3': 7}})
>>> 


这是普通的字典
>>> d={}
>>> d['k1']['v1']=7
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'k1'     #出错了
>>> 

因此,在defaultdict()中,参数是list说明生成的字典的value部分是列表类型的,dict同理。

4.可命名元组

以前只能通过索引访问元组中的元素,通过创建一个类,可以实现通过名字访问元组中的对应的元素
>>>MytupleClass=collections.namedtuple("MytupleClass",['x','y','z'])
>>>obj=MytupleClass(11,12,13) #元素值与上面的想x,y,z一一对应
>>> obj.x
11
>>> obj.y
12
>>> obj.z
13
>>> 

5.队列

队列(分为单向队列(先进先出)和双向队列(不按套路出牌,前后都可取可放))。这里讲到的是双向队列
q=collections.deque()   #创建一个双队列对象

q.append(1)  #默认从右边即最后面添加
q.appendleft(10)
q.appendleft(1)    #从左边添加
print q
"""
deque([1, 10, 1])
"""

q.extend(['yy','uu','ii'])   #从右边扩展
>>>deque([1, 10, 1, 'yy', 'uu', 'ii'])

q.extendleft(['yy','uu','ii'])  #从左边扩展
>>>deque(['ii', 'uu', 'yy', 1, 10, 1, 'yy', 'uu', 'ii'])

q.rotate(1)   #从右边拿数据插入到左边,这里1代表从右边拿一个放到左边
>>>deque(['ii', 'ii', 'uu', 'yy', 1, 10, 1, 'yy', 'uu'])

单向队列简介(这里需要导入一个新的模块queue)

import queue
#创建一个单项队列,先进先出
qe=queue.Queue()
qe.put(1)  #向队列里put元素(队尾入)
qe.put(2)
print qe.qsize()   #获取队列的大小
print qe.get()   #从队列中取元素(队头取)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值