Python学习基础笔记三十七——collections模块

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('')

 运行结果:

Python学习基础笔记三十七——collections模块_第1张图片

 

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,我们可以了解到更多的数据类型和数据结构。

你可能感兴趣的:(Python,python)