1、collections模块:
内置数据类型:列表list、字典dict、集合set、元组tuple。
Collections模块提供了另外的数据类型:
队列deque、双端队列:可以快速地从另外一侧追加和推出元素;
namedtuple: 生成可以使用名字来访问元素内容的tuple;
Counter:计数器,主要用来计数;
OrderedDict:有序字典;
defaultDict: 带有默认值的字典;
2、namedtuple:
p = (1, 2) # 这个tuple表示一个坐标
from collections import namedtuplePoint = namedtuple('Point', ['x', 'y', 'z'])
p1 = Point(1, 2, 3)
p2 = Point(3, 2, 1)print(p1.x)
print(p1.y)
print(p1.z)
print(p1)
纸牌的小例子:
from collections import namedtupleCard = namedtuple('card', ['suits', 'number'])# card1 = Card('红桃', 2)
#
# print(card1)
# print(card1.suits)
# print(card1.number)# 打印牌
suits_lst = ['红桃', '梅花', '黑桃', '方块']
number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']cards = []
for i in suits_lst:for j in number_list:cards.append(Card(i, j))count = 0
while count < 52:print(cards[count])count += 1if count % 13 == 0:print('')
运行结果:
3、队列:
堆栈:先进后出
队列:先进先出(例子:购票、处理任务等场景)
import queueq = queue.Queue() # 创建了一个q队列对象,构造函数# 往里面放几个对象
q.put(10)
q.put(5)
q.put(23)# 打印队列
print(q)# 获取队列大小
print("qsize: ", q.qsize())# 取出对象
print(q.get()) # 取到10
print(q.get()) # 取到5
print(q.get()) # 取到23
# print(q.get()) # 阻塞状态,一直运行状态
双端队列:
from collections import dequedq = deque([1, 2])dq.append('a') # 从后面放入数据 [1, 2, 'a']
dq.appendleft('b') # 从前面放数据 ['b', 1, 2, 'a']
dq.insert(1, '3') # 插入一个数3, ['b', 1, 3, 2, 'a']
print(dq.pop()) # 从后面取数据 ['b', 1, 3, 2], 将a取出
print(dq.popleft()) # 从前面取数据 [1, 3, 2], 将b取出print(dq.pop())
print(dq.pop())
print(dq.pop())
说明:
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量很大的时候,插入和删除效率低。
deque是为了高效实现插入和删除操作的双向队列,适用于队列和栈。
deque除了实现list的append()和pop(),还支持appendleft()和popleft(), 这样就可以非常高效地往头部添加和删除元素。
4、有序字典OderedDict:
使用dict的时候,Key是无序的,在对dict做迭代的时候,我们无法确定Key的顺序。
那如果要保持Key的顺序,可以使用OrderedDict:
from collections import OrderedDictd = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od)
print(od['a'])for k in od:print(k, od[k])
同样是存储值,字典比列表list占用内存,有序字典更是占用内存,值个数比较多的话,用字典比较消耗内存。购物车可以使用字典。
5、默认字典:
原生字典解决:{'k1': 大于66 , 'k2': 小于66}
values = [11, 22, 33,44,55,66,77,88,99,90]my_dict = {}for value in values:if value>66:if my_dict.has_key('k1'):my_dict['k1'].append(value)else:my_dict['k1'] = [value]else:if my_dict.has_key('k2'):my_dict['k2'].append(value)else:my_dict['k2'] = [value]
默认字典的解决方法:
from collections import defaultdictvalues = [11, 22, 33,44,55,66,77,88,99,90]my_dict = defaultdict(list) # 默认是listfor value in values:if value>66:my_dict['k1'].append(value)else:my_dict['k2'].append(value)defaultdict字典解决方法
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
from collections import defaultdict# 注意下这个lambda没有参数,直接有返回值
dd = defaultdict(lambda : 'N/A') dd['key1'] = 'abc'
print(dd['key1'])# key2 不存在,就返回默认值
print(dd['key2'])
6、Counter:
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
from collections import Counterc = Counter('abcadsfdfaekadfeadfae')print(c)
只能计算字符串。
通过这个collections,我们可以了解到更多的数据类型和数据结构。