内置数据结构

2018 年 10 月 12 日 • 阅读数: 90

Collections模块

简介

  • 该模块扩展了python内置的一些数据结构
  • 同时也提供了一些其他的更加方便的数据结构

tuple

  • 不可变
  • 可迭代对象
  • 可拆包
name_tuple = ('amor',21,170,'chongqing')
for item in name_tuple:
    print(item,end=' ')
amor 21 170 chongqing 
name,age,height,addr = name_tuple
print(name,age,height,addr)
amor 21 170 chongqing
name,*other = name_tuple
print(name,other)
amor [21, 170, 'chongqing']
  • tuple不可变不是绝对的,若tuple内部存入一个可变的list或其他集合,则可以更改嵌套的集合内元素
  • 实际上tuple内部存入的是一个对象的内存地址,和浅拷贝同理
new_tuple = ('amor',[18,21])
print(new_tuple)
('amor', [18, 21])
new_tuple[1].append(25)
print(new_tuple)
('amor', [18, 21, 25])
  • tuple比list好的地方
  • tuple是一个immutable类型
  • immntable是不可变类型,可以做到性能优化,线程安全,可以作为dict的key以及拆包特性

namedtuple

  • 是tuple的一个子类
  • 它可以创建一个一般类,相当于用class创建一个类
  • 但是它的性能不class创建的类更好
  • 同时它具有tupel的特性,虽然也可以通过魔法方法实现一样的效果
  • 但直接使用namedtuple更简单,更方便
from collections import namedtuple
User = namedtuple('User',['name','age','height'])
user = User(name='amor',age=21,height=176)
print(user)
User(name='amor', age=21, height=176)
  • 使用tuple直接创建一个namedtuple
  • 也可以使用dict创建一个namedtuple
  • 还可以使用一个任意可迭代对象创建,如list,但这种方法的灵活性不如上面2种
"""
关于参数中的*args和**kargs
*args是将参数打包成一个tuple,后面可以继续追加参数,直接通过value的方式
**kargs是将参数打包成一个dict,后面也可以继续追加参数,通过key=value的方式
而使用_make的方式传递的是一个可迭代对象,只能传递一个参数,不能够在后面最佳参数
"""
user_tuple = ('amor',21,176)
user = User(*user_tuple)
print(user)
User(name='amor', age=21, height=176)
user_dict = {'name':'amor','age':21,'height':176}
user = User(**user_dict)
print(user)
User(name='amor', age=21, height=176)
user_list = ['amor',21,176]
user = User._make(user_list)
print(user)
User(name='amor', age=21, height=176)
  • 通过_asdict方法可以将namedtuple转换成一个OrderedDict
user_dict = user._asdict()
type(user_dict)
collections.OrderedDict

defaultdict

  • dict的一个扩展子类
  • 当一个键不存在的时候,可以给他赋一个默认的值
  • 在初始化的时候需要传入一个可调用的参数,可以是简单的如list,int,如果要实现一定的逻辑可以定义一个函数
'''使用内置dict'''
str_dict = {}
s1 = ['a','b','d','d','c','a','d']
for s in s1:
    str_dict.setdefault(s,0)
    str_dict[s] += 1
print(str_dict)
{'a': 2, 'b': 1, 'd': 3, 'c': 1}
from collections import defaultdict
default_dict = defaultdict(int)
default_dict['amor']
print(default_dict)
defaultdict(<class 'int'>, {'amor': 0})
'''使用defauledict'''
default_dict = defaultdict(int)
s1 = ['a','b','d','d','c','a','d']
for s in s1:
    default_dict[s] += 1
print(default_dict)
defaultdict(<class 'int'>, {'a': 2, 'b': 1, 'd': 3, 'c': 1})

deque

  • 双端队列
  • 参数需要一个可迭代对象
  • 扩展了list,它可以直接在队列的前后进行操作
  • deque是一个线程安全,list不是
from collections import deque
deque_list = deque(['ly','wmm'])
print(deque_list)
deque_list.append('wjl')
deque_list.appendleft('zxy')
print(deque_list)
deque(['ly', 'wmm'])
deque(['zxy', 'ly', 'wmm', 'wjl'])

counter

  • 统计函数
  • dict的一个子类
  • 参数需要一个可迭代对象
  • update方法可以传入一个可迭代对象加入原有统计中
  • most_common方法返回一个出现频率最高的指定个数数据
from collections import Counter
user_counter = Counter('shgdlsjahd')
user_counter.update('shidhi')
print(user_counter)
print(user_counter.most_common(3))
Counter({'h': 4, 's': 3, 'd': 3, 'i': 2, 'g': 1, 'l': 1, 'j': 1, 'a': 1})
[('h', 4), ('s', 3), ('d', 3)]

Ordereddict

  • 有序的字典,先添加的在前面,后添加的在后面
  • dict的一个子类
from collections import OrderedDict
user_dict = OrderedDict()
user_dict['b'] = 'ly'
user_dict['a'] = 'wmm'
user_dict['c'] = 'wjl'
print(user_dict)
OrderedDict([('b', 'ly'), ('a', 'wmm'), ('c', 'wjl')])

ChainMap

  • 方便访问多个dict
from collections import ChainMap
user_dict1 = {'a':'ly','b':'wmm'}
user_dict2 = {'c':'wjl','d':'zxy'}
new_dict = ChainMap(user_dict1,user_dict2)
for key,value in new_dict.items():
    print(key,value)
a ly
c wjl
b wmm
d zxy
标签: Python数据结构

召唤伊斯特瓦尔