python中collections的数据结构
2019-06-12 本文已影响0人
___大鱼___
__all__ = ['Counter', 'deque', 'defaultdict', 'namedtuple', 'OrderedDict', 'ChainMap']
namedtuple
# coding: utf-8
from collections import namedtuple
# 创建一个简洁的User类 []里面的参数代表 __init__初始化的参数
User = namedtuple('User', ['name', 'age', 'hometown'])
# user = User(name='李四', age=23, hometown='中国')
user_tuple = ('李四', 23, '中国')
user = User._make(user_tuple) # 参数为iterable对象
user_info_dict = user._asdict()
print(user.name)
print(user.age)
print(user.hometown)
print(user_info_dict)
name, age, *other = user # 支持拆包
print(name, age, *other)
defaultdict
# coding: utf-8
from collections import defaultdict
# 判断一个元素在字典中出现的次数
user_dict = {
}
users = ['fish', 'fish1', 'fish2', 'fish1', 'fish2', 'fish1', 'fish2', 'fish']
for user in users:
print(user)
user_dict.setdefault(user, 0) # 如果key不存在 则设置key 默认值为0
user_dict[user] += 1
print(user_dict)
# 使用defaultdict
# 判断一个元素在字典中出现的次数 defaultdict传递的参数是可调用对象的名称
user_dict = defaultdict(int) # int 0 list [] dict {}
users = ['fish', 'fish1', 'fish2', 'fish1', 'fish2', 'fish1', 'fish2', 'fish']
for user in users:
user_dict[user] += 1 # 如果值不存在默认为0
print(user_dict)
# 使用函数调用传递默认值
def get_default_dict():
return {
'name': '大鱼',
'age': 18
}
user_dict = defaultdict(get_default_dict) # int 0 list [] dict {}
users = ['fish', 'fish1', 'fish2', 'fish1', 'fish2', 'fish1', 'fish2', 'fish']
for user in users:
user_dict[user]['group'] = '测试' # 如果值不存在默认为0
print(user_dict)
deque
# 双端队列 指可以在一个可迭代对象左右两侧添加元素
from collections import deque
user_list = deque(['张三', '李四', '王五', '赵六'], maxlen=4)
user_list.appendleft('大鱼') # 从列表左侧添加
# deque(['大鱼', '张三', '李四', '王五'], maxlen=4) 如果超过最大长度则自动舍弃第一位 PS:'大鱼'
print(user_list)
user_list.popleft() # 从左侧删除 deque(['张三', '李四', '王五'], maxlen=4)
print(user_list)
Counter
from collections import Counter
user_list = ['fish', 'fish1', 'fish2', 'fish1', 'fish2', 'fish1', 'fish2', 'fish']
user_count = Counter(user_list) # 统计每个元素出现的次数
print(user_count)
# top n的问题 解决方案 堆
user_count_1 = user_count.most_common(1) # 筛选出出现次数最多的一个元素
print(user_count_1)
OrderedDict
# OrderedDict 使我们添加元素的顺序是有序的 dict是无序的 如果是python3默认是排序的
from collections import OrderedDict
user_dict = OrderedDict()
user_dict['fish'] = 10
user_dict['fish1'] = 10
user_dict['fish12'] = 10
user_dict['2'] = 101
print(user_dict)
print(user_dict.popitem()) # 删除末尾的一个item 并将删除的key, value返回
print(user_dict)
user_dict.move_to_end('fish1') # 移动某一个元素到最后
print(user_dict)
ChainMap
from collections import ChainMap
user_dict1 = {'fish': 1, 'fish2': 2}
user_dict2 = {'fish2': 4, 'fish3': 5}
map_dict = ChainMap(user_dict1, user_dict2) # 合并多个字典为一个字典
# ChainMap({'fish': 1, 'fish2': 2}, {'fish2': 4, 'fish3': 5})
print(map_dict)
# 打印结果重复key没有被删除 但是遍历的时候就没有相同的key
for key, value in map_dict.items():
print(key, value)
map_dict1 = map_dict.new_child({'1': 2}) # 添加一个新的合并值
print(map_dict1)
print(map_dict.maps) # 把ChainMap对象转化为一个列表操作