collections

#! /usr/bin/env python
# -*- coding: utf-8 -*-

'''
@author: liudaoqiang
@file: studycase
@time: 2018/10/2 10:47
'''
import unittest
import logging
from collections import namedtuple
from collections import defaultdict
from collections import deque
from collections import Counter
from collections import OrderedDict
from collections import ChainMap

logging.basicConfig(filename='./LOG/'+__name__+'.log',
                    format='[%(asctime)s-%(filename)s-%(levelname)s:%(message)s]',
                    level = logging.DEBUG,filemode='a',datefmt='%Y-%m-%d %I:%M:%S %p')

class TestCase(unittest.TestCase):

    def test_namedtuple(self):
        City = namedtuple('City', 'name country population coordinates')
        tokyo = City('Tokyo', 'JP', 36.933,  (35.68, 139.69))
        logging.debug("City._fields: %s" ,City._fields)
        # _fields 属性包含namedtuple类所有字段的元组名
        print(City._fields)
        self.assertEqual(City._fields[0], 'name')
        # _asdictOrderedDict形式返回实例的key和value
        print(tokyo._asdict())
        self.assertEqual(tokyo._asdict()['name'], 'Tokyo')
        # _make接收可迭代对象生成实例
        LatLong = namedtuple('LatLong', 'lat log')
        delhi_data = ('Delhi NCR', 'IN', 21935, LatLong(28.613, 77.20))
        delhi = City._make(delhi_data)
        print(delhi._asdict())
        self.assertEqual(delhi._asdict()['name'], 'Delhi NCR')

    def test_defaultdict(self):
        langs = ['java', 'php', 'python', 'c#', 'kotlin', 'swift', 'python']
        res_dict = defaultdict(int)
        for lang in langs:
            res_dict[lang] += 1
        print(res_dict)
        self.assertEqual(res_dict['c++'], 0) #找不到key返回int默认值0
        # 给defaultdict定义复杂的默认返回值
        def  gen_dict():
            return  {'name': 'None', 'age': 8}
        res_dict = defaultdict(gen_dict)
        self.assertEqual(res_dict['zhangsan']['age'], 8)

    def test_deque(self):
        '''
        deque双端队列线程安全
        '''
        dq = deque(range(10), maxlen=10)
        dq.appendleft(-1)
        self.assertEqual(dq[0], -1) #deque([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8], maxlen=10)
        dq.extend([11,12]) #deque([1, 2, 3, 4, 5, 6, 7, 8, 11, 12], maxlen=10)
        self.assertEqual(dq[0], 1)
        self.assertEqual(dq[9], 12)
        dq.rotate(3) #rotate(n), n > 0表示把最右边的n个元素放到左边,n < 0表示把最左边n个元素放大右边
        print(dq) #deque([8, 11, 12, 1, 2, 3, 4, 5, 6, 7], maxlen=10)
        self.assertEqual(dq[0], 8)
        print(dq.rotate(-3)) #deque([1, 2, 3, 4, 5, 6, 7, 8, 11, 12], maxlen=10)
        self.assertEqual(dq[0], 1)

    def test_counter(self):
        langs = ['java', 'php', 'python', 'c#', 'kotlin', 'swift', 'python']
        cnt = Counter(langs)
        self.assertEqual(cnt['java'], 1)
        cnt.update(['java', 'c']) # 向cnt中添加字符串
        self.assertEqual(cnt['java'], 2)
        # most_common(n)找到deque中键出现次数排名前n的最多的次数
        self.assertEqual(cnt.most_common(1), [('java', 2)])

    def test_orderDict(self):
        '''添加键时保持顺序'''
        # OrderedDict 的keys() values() items()不支持索引,要用list
        d = OrderedDict.fromkeys('abcde')
        d.move_to_end('b')
        self.assertEqual(''.join(d.keys()),'acdeb')
        d = {'banana':3, 'apple':4, 'pear':1, 'orange':2}
        d = OrderedDict(sorted(d.items(), key=lambda t:t[0]))
        self.assertEqual(list(d.values())[0],4)
        d = OrderedDict(sorted(d.items(), key=lambda t:t[1]))
        self.assertEqual(list(d.keys())[0], 'pear')

    def test_chainmap(self):
        '''chainmap快速链接多个dict'''
        d1 = {"java":3, 'python':4}
        d2 = {'c++':1, 'java':2}
        d3 = ChainMap(d1, d2)
        self.assertEqual(d3.maps[0]['python'], 4)

if __name__ == "__main__":
    unittest.main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值