#! /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()