zoukankan      html  css  js  c++  java
  • 八、collection系列-----计数器、有序字典、默认字典、可命名元组、双向队列、单向队列一.计数器(对字典的扩展)

    一.计数器(对字典的扩展)
    有如下一个字典:
    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() =====>当里面没有数据了,光标就停在那里等待,直到里面有了,我就可以拿到了
  • 相关阅读:
    【Linux_Unix系统编程】Chapter4 文件IO
    【Unix网络编程】chapter6 IO复用:select和poll函数
    【Unix网络编程】 chapter5 TCP客户,服务器程序实例
    【Unix网络编程】chapter3 套接字编程简介
    VS自动编译脚本
    【Python编程:从入门到实践】chapter4 操作列表
    【Python编程:从入门到实践】chapter3 列表简介
    【Python编程:从入门到实践】chapter2 变量和简单数据类型
    【Unix网络编程】chapter2传输层:TCP,UDP和SCTP
    vim配置编辑php
  • 原文地址:https://www.cnblogs.com/steven9898/p/11329354.html
Copyright © 2011-2022 走看看