1、collections模块:
内置数据类型:列表list、字典dict、集合set、元组tuple。
Collections模块提供了另外的数据类型:
队列deque、双端队列:可以快速地从另外一侧追加和推出元素;
namedtuple: 生成可以使用名字来访问元素内容的tuple;
Counter:计数器,主要用来计数;
OrderedDict:有序字典;
defaultDict: 带有默认值的字典;
2、namedtuple:
p = (1, 2) # 这个tuple表示一个坐标
from collections import namedtuple
Point = 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 namedtuple
Card = 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 += 1
if count % 13 == 0:
print('')
运行结果:
3、队列:
堆栈:先进后出
队列:先进先出(例子:购票、处理任务等场景)
import queue
q = 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 deque
dq = 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 OrderedDict
d = 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 defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list) # 默认是list
for 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 Counter
c = Counter('abcadsfdfaekadfeadfae')
print(c)
只能计算字符串。
通过这个collections,我们可以了解到更多的数据类型和数据结构。