| 
 | 1 | +#!/usr/bin/env python3  | 
 | 2 | +# -*- coding: utf-8 -*-  | 
 | 3 | + | 
 | 4 | +'练习内建模块之collections'  | 
 | 5 | + | 
 | 6 | +__author__ = 'sergiojune'  | 
 | 7 | +from collections import namedtuple, defaultdict, deque, OrderedDict, Counter  | 
 | 8 | + | 
 | 9 | +# 弄一个可以根据名字来取数的元组  | 
 | 10 | +at = namedtuple('Point', ['x', 'y'])  # 第一个参数为描述事物类型, 第二个参数为元组的位置名字  | 
 | 11 | +p = at(1, 2)  # 新建一个元组  | 
 | 12 | +# 根据名字来取元素  | 
 | 13 | +print(p.x)  # 这就可以看作是一个坐标点  | 
 | 14 | +print(p.y)  | 
 | 15 | + | 
 | 16 | +# 有默认值的dict  | 
 | 17 | +dd = defaultdict(lambda:'not')  # 参数为遇到不存在键时的处理的方法  | 
 | 18 | +dd['age'] = 20  | 
 | 19 | +print(dd['age'])  # 存在  | 
 | 20 | +print(dd['a'])  # 不存在  | 
 | 21 | + | 
 | 22 | + | 
 | 23 | +# 使用队列,比list的插入数据和删除数据快,支持从头或者尾删除或插入  | 
 | 24 | +d = deque([1, 2, 3, 6])  | 
 | 25 | +print(d)  | 
 | 26 | +# 从头插入数据  | 
 | 27 | +d.appendleft(5)  | 
 | 28 | +print(d)  | 
 | 29 | +# 删除头部数据  | 
 | 30 | +d.popleft()  | 
 | 31 | +print(d)  | 
 | 32 | + | 
 | 33 | +# 让字典保持有序  | 
 | 34 | +od = OrderedDict([('x', 3), ('y', 6), ('z', 6)])  | 
 | 35 | +print(od)  | 
 | 36 | +# 还可以添加,与dict用法一样  | 
 | 37 | +ood = OrderedDict()  | 
 | 38 | +ood['f'] = 5  | 
 | 39 | +ood['s'] = 9  | 
 | 40 | +ood['e'] = 7  | 
 | 41 | +print(ood)  | 
 | 42 | + | 
 | 43 | + | 
 | 44 | +# 用计数器,直接算出某一个字符串里面字符出现的个数  | 
 | 45 | +s = 'mynameissergiojune'  | 
 | 46 | +c = Counter(s)  | 
 | 47 | +print(c)  | 
 | 48 | + | 
 | 49 | + | 
 | 50 | +# 利用OrderedDict实现一个先进先出的字典,超过最大容量的时候就删除  | 
 | 51 | +class LastUpdateDict(OrderedDict):  | 
 | 52 | +    def __init__(self, max):  | 
 | 53 | +        super(LastUpdateDict, self).__init__()  | 
 | 54 | +        self.max = max  | 
 | 55 | + | 
 | 56 | +    def __setitem__(self, key, value):  | 
 | 57 | +        # 看看有没有重复键  | 
 | 58 | +        contains = 1 if key in self.keys() else 0  | 
 | 59 | +        # 判断最大长度  | 
 | 60 | +        if len(self) - contains >= self.max:  | 
 | 61 | +            last = self.popitem(last=False)  # last 为false时就删除第一个添加的键值对,否则删除最后的键值对  | 
 | 62 | +            print('pop', last)  | 
 | 63 | +        # 增加元素  | 
 | 64 | +        if contains: # 键原来存在,直接修改  | 
 | 65 | +            del self[key]  | 
 | 66 | +            print('update', key, value)  | 
 | 67 | +        else:  | 
 | 68 | +            print('add', key, value)  | 
 | 69 | +        OrderedDict.__setitem__(self, key, value)  | 
 | 70 | + | 
 | 71 | + | 
 | 72 | +lud = LastUpdateDict(3)  | 
 | 73 | +lud['a'] = 1  | 
 | 74 | +lud['b'] = 2  | 
 | 75 | +lud['c'] = 3  | 
 | 76 | +print(lud)  | 
 | 77 | +lud['d'] = 4  | 
 | 78 | +print(lud)  | 
 | 79 | +lud['b'] = 5  | 
 | 80 | +print(lud)  | 
0 commit comments