一.计数器(对字典的扩展)
有如下一个字典:
dic = {'k1':123,'k2':123,'k3':12}
统计12出现的次数,123出现的次数
1.统计出现次数
>>> import collections >>> c = collections.Counter("rewqfsdvcxzfgafrwqerwgfdjg;ldskj") >>> c
Counter({'f': 4, 'r': 3, 'g': 3, 'w': 3, 'd': 3, 'q': 2, 'e': 2, 's': 2, 'j': 2, 'z': 1, 'k': 1, 'x': 1, ';': 1, 'c': 1, 'a': 1, 'l': 1, 'v': 1}) ======》它告诉了你f出现了4次,r出现了3次。。。。。。。
2.返回前几名
>>> c.most_common(1) [('f', 4)] >>> c.most_common(2) [('f', 4), ('r', 3)] >>> c.most_common(3) [('f', 4), ('r', 3), ('g', 3)] >>> c.most_common(4) [('f', 4), ('r', 3), ('g', 3), ('w', 3)] >>> c.most_common(5) [('f', 4), ('r', 3), ('g', 3), ('w', 3), ('d', 3)] >>> c.most_common(6) [('f', 4), ('r', 3), ('g', 3), ('w', 3), ('d', 3), ('q', 2)]
3.相加
>>> c1 = collections.Counter('aabc') >>> c2 = collections.Counter('aac') >>> c1 Counter({'a': 2, 'c': 1, 'b': 1}) >>> c2 Counter({'a': 2, 'c': 1}) >>> c1.update(c2) >>> c1 Counter({'a': 4, 'c': 2, 'b': 1})
4.相减
>>> c1 Counter({'a': 4, 'c': 2, 'b': 1}) >>> c2 Counter({'a': 2, 'c': 1}) >>> c1.subtract(c2) >>> c1 Counter({'a': 2, 'c': 1, 'b': 1})
5.迭代器 =====> element
>>> c1 Counter({'a': 4, 'c': 2, 'b': 1}) >>> for item in c1.elements():print (item) c c a a a a b
二.有序字典======>和dict字典是一模一样的,只是它排序了
o1 = collections.OrderedDict() o1['k1'] = 1 o1['k2'] = 2 o1['k3'] = 3 >>> o1 OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
三.默认字典========>普通字典的默认value值是None,通过defaultdict修改其默认值为列表;即为你字典里的value设置一个默认类型
collections.defaultdict
传统方式:需要做判断,判断里面的值是否是列表,因为它默认value是None,不能用append方法
dic = {} if 'k1' in dic.keys(): dic['k1'].append(1) else: dic['k1'] = [1,]
默认字典方式:=========>相当于给你设定了一个默认值,默认值就是一个空列表
>>> dic = collections.defaultdict(list) >>> dic defaultdict(<class 'list'>, {}) >>> dic['k1'].append(1) >>> dic defaultdict(<class 'list'>, {'k1': [1]})
四.可命名元组(对元组的扩展)
例:
(1,4) 1,4是我们的位置上的某个点,分别代表x轴和y轴,但是,这样的表述方法只有我们知道,别人不知道,所以需要给元组命名为x=1,y=4,z=5........可命名元组的使用步骤为: 1.创建类 Mytuple = collections.namedtuple('Mytuple',['x','y']) 这个命令用于创建一个扩展tuple的类,类名叫Mytuple 2.使用类创建对象 我们在创建元组的时候是这样的: t1 = (1,2)<====================>t1 = tuple(1,2) 你执行前面一个实际上Python的内部机制还是回去调后面这种方式,现在我们自己定义了一个元组扩展的类,可以看看 >>>t2 = Mytuple(1,2) 发现它返回了一个(x=1,y=2)的元组 >>>t2 Mytuple(x=1, y=2) 3.使用对象 >>> t2.x 现在我们就可以使用t2.x和t2.y分别取访问这两个元素了 1 >>> t2.y 2 我们自己创建的类也是有方法的,通过 dir(Mytuple)或者help(Mytuple)可以查看到 >>> help(Mytuple) Help on class Mytuple in module __main__: class Mytuple(builtins.tuple) =====>这句话表示Mytuple是通过tuple扩展的类,即tuple是Mytuple的父类,这个 也叫作继承,子类继承父类,表示它可以继承它的父类里的所有东西供自己使用 Mytuple(x, y) >>> dir(Mytuple) ['__add__', '__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_asdict', '_fields', '_make', '_replace', '_source', 'count', 'index', 'x', 'y']
五.双向队列
特性1.两头都可以插,两头都可以取
特性2.线程安全,即多个线程来拿的时候我就会给你加个锁,谁先拿了其他人就不能来碰了,这就叫线程安全。
>>> help(collections.deque) >>> q = collections.deque() ======>创建了一个空的双向队列 >>> q.append(1) ======>append了几个值 >>> q.append(2) >>> q.append(3) >>> q.append(4) >>> q.append(5) >>> q deque([1, 2, 3, 4, 5])
六.单向队列(不在collection模块里,在queue模块里,也是线程安全的)
>>> import queue >>> dir(queue) ['Empty', 'Full', 'LifoQueue', 'PriorityQueue', 'Queue', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'deque', 'heappop', 'heappush', 'threading', 'time'] 创建一个单向队列 >>> q = queue.Queue(10) =======>10代表这个单向队列里面最多放10条数据 >>> q <queue.Queue object at 0x02AC2E50> 往里加数据: >>> q.put(1) >>> q.put(2) >>> q.put(3) 往外拿数据: >>> q.get() 1 >>> q.get() 2 >>> q.get() 3 >>> q.get() =====>当里面没有数据了,光标就停在那里等待,直到里面有了,我就可以拿到了