python内置库-collections

Counter

功能:是一个字典的子类,用于计数可哈希对象(不可变对象)
格式:Counter(iterable)
描述:

from collections import Counter
c1 = Counter('abbccd')
c2 = Counter(['a', 'b', 'b', 'c', 'c', 'd'])
print(c1)
print(c2)

输出:

Counter({'b': 2, 'c': 2, 'a': 1, 'd': 1})
Counter({'b': 2, 'c': 2, 'a': 1, 'd': 1})

下面是不可哈希对象,会报错

c3 = Counter([['a'], ['b'], ['b'], ['c'], ['c'], ['d']])

namedtuple

from collections import namedtuple

"""
创建一个  命名元组子类 的工厂函数
作用:用以构建只有少数属性但是没有方法的对象
namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
"""

'''
定义:  typename --> 元组子类的类名
       field_names --> 属性名
       rename -->
       default --> 
'''
# 定义时,field_names可以有三种写法:'a b c'  'a, b, c'  ['a', 'b', 'c']
People = namedtuple('People', ['age', 'name', 'sex'])
p1 = People(18, 'xiaoming', 'nan')

''' 访问 '''
# 将p1当成一个对象来访问
print(p1.name)

# 将p1当成一个元组来访问
print(p1[0], p1[1], p1[2])

''' 默认值   向右对齐'''
animal = namedtuple('animal', ['name', 'age', 'sex'], defaults=[0, '公'])
a1 = animal('monkey')
print(a1[0], a1[1], a1[2])

deque

from collections import deque

"""
deque(iteable, maxlen)
描述:用户创建双向队列
iteable:任意可迭代对象
maxlen: 队列最大长度,
         默认无限长
         有值时达到最大长度后,新项从一端进时老值从另一端出
         
append(x):添加 x 到右端。
appendleft(x):添加 x 到左端。
clear():移除所有元素,使其长度为0.
copy():创建一份浅拷贝。3.5 新版功能.
count(x):计算deque中个数等于 x 的元素。3.2 新版功能.
extend(iterable):扩展deque的右侧,通过添加iterable参数中的元素。
extendleft(iterable):扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。
index(x[, start[, stop]]):返回第 x 个元素(从 start 开始计算,在 stop 之前)。返回第一个匹配,如果没找到的话,升起 ValueError 。3.5 新版功能.
insert(i, x):在位置 i 插入 x 。如果插入会导致一个限长deque超出长度 maxlen 的话,就升起一个 IndexError 。3.5 新版功能.
pop():移去并且返回一个元素,deque最右侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
popleft():移去并且返回一个元素,deque最左侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
remove(value):移去找到的第一个 value。 如果没有的话就升起 ValueError 。
reverse():将deque逆序排列。返回 None 。3.2 新版功能.
rotate(n=1):向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 
             向左循环一步就等价于 d.append(d.popleft()) 。
Deque对象同样提供了一个只读属性:
maxlen:Deque的最大尺寸,如果没有限定的话就是 None 。
             
"""

dq = deque()
print(dq)  # deque([])

dq = deque('abc', 10)
print(dq)  # deque(['a', 'b', 'c'], maxlen=10)
print(list(dq))  # ['a', 'b', 'c']

defualtdict

from collections import defaultdict
"""
字典的子类,为字典的访问提供默认值
描述:使用dict时,如果应用的key不存在,则返回设置的默认值。
defaultdict(default_factory=None, **kwargs)

default_factory   用于设置字典值的默认值,default_factory是一个可调用的对象
"""

dic1 = defaultdict(lambda: 'no exist')
print(dic1['dic1'])  # no exist
print(dic1.get('test'))  # None

dic2 = defaultdict(int)
print(dic2['dic2'])  # 0
print(dic2.get('test2'))  # None


''' 应用举例 '''
# 列表:
l = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in l:
    d[k].append(v)
print(d)  # {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]}

# 计数
s = 'abbccc'
d = defaultdict(int)
for w in s:
    d[w] = d[w]+1
print(d)  # {'a': 1, 'b': 2, 'c': 3}

OrderedDict

from collections import OrderedDict
import copy

"""
字典的子类,保留了元素被添加的顺序
功能: 1、记住插入顺序(初始化时候的顺序是否记住了)  
       2、根据key,value排序

"""

''' 定义 '''
d = OrderedDict(name="xiaoming", age=18)
d['sex'] = 'nan'
d['job'] = 'student'
d['sport'] = 'football'
print(d)
print(d['name'])

''' 排序 '''
fruits = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2, 'cherry': 10}
sorted_fruits_by_key = OrderedDict(sorted(fruits.items(), key=lambda x: x[0]))
print(sorted_fruits_by_key)
sorted_fruits_by_value = OrderedDict(sorted(fruits.items(), key=lambda x: x[1]))
print(sorted_fruits_by_value)

print(isinstance(sorted_fruits_by_value, dict))  # True

''' 其他方法 '''
print("##################### 弹出 ######################")
d1 = d.copy()
print(f'd1:{d1}')
print(d1.popitem(-1))  # 弹出尾
print(d1.popitem())  # 弹出尾
print(d1.popitem(last=True))  # 弹出尾
print(d1.popitem(last=False))  # 弹出头
print(d1.popitem(0))  # 弹出头

print("##################### 移动元素 ######################")
d2 = d.copy()
print(f'd2:{d2}')
d2.move_to_end('name')  # 移动到尾
d2.move_to_end('name', last=True)  # 移动到尾
d2.move_to_end('name', last=False)  # 移动到头
print(d2)

# 访问的key不存在则添加key
d3 = d.copy()
val = d3.setdefault('k5')
print(val)
print(d3)

# 传统的字典不能指定索引pop项目
x = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
print(x.pop('apple'))
print(x.popitem())

ChainMap

from collections import ChainMap

"""
字典的容器
如果键相同,前面的会覆盖后面的
"""

d1 = {'red': 1, 'yellow': 2}
d2 = {'green': 3, 'white': 4, 'red':10}
combine = ChainMap(d1, d2)
print(combine)  # {'red': 1, 'yellow': 2}, {'green': 3, 'white': 4}
for k, v in combine.items():
    print(f'{k}: {v}')

print('\n')

combine_rev = ChainMap(d2, d1)
print(combine_rev)  # {'green': 3, 'white': 4}, {'red': 1, 'yellow': 2}
for k, v in combine_rev.items():
    print(f'{k}: {v}')


''' 更新 '''
print(f'\n#####更新')
combine.maps[0]['red'] = 100
print(combine)

abc

UserDict

from collections import UserDict
import sys
"""
这个UserDict只是一个内置dict的封装类,其中包含的字典内容通过data访问.

想要创建自己的具有某些修改函数或某些新函数的字典时,此类非常有用。它可以被视为为字典添加新行为的一种方式。此类将字典实例作为参数,并模拟保存在常规字典中的字典。该类的data属性可访问该词典。
"""
d = {'a': 1, 'b': 2, 'c': 3}
ud = UserDict(d)  # {'a': 1, 'b': 2, 'c': 3}
print(ud.data)

print(sys.getsizeof(d))  # 232
print(sys.getsizeof(ud)) # 48
print(sys.getsizeof(ud.data)) # 232

UserList

UserString

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值