collections --容器数据类型,collections模块包含了除内置类型list,dict和tuple以外的其他容器数据类型。

Counter 作为一个容器可以追踪相同的值增加了多少次

#初始化
print(collections.Counter('qweqwe'))
print(collections.Counter(['q','w','e','q','w','e']))
print(collections.Counter(q=2,w=2,e=2,))
print(collections.Counter({'q':2,'w':2,'e':2})) 结果:
Counter({'q': 2, 'e': 2, 'w': 2})
Counter({'q': 2, 'e': 2, 'w': 2})
Counter({'q': 2, 'e': 2, 'w': 2})
Counter({'q': 2, 'e': 2, 'w': 2})
#构造空的Counter,使用update()填充
c = collections.Counter()
print(c)
c.update('qweqwe')
print(c)
c.update(['q','e','w','w'])
c.update({'q':2,'e':2})#计数值会增加,替换数据不会改变计数
c.update('qqew')
print(c) 结果:
Counter()
Counter({'w': 2, 'e': 2, 'q': 2})
Counter({'q': 7, 'e': 6, 'w': 5})
# 访问计数,一旦填充了Counter,可以使用 字典api获取他的值
b = collections.Counter('qwedwewqsa')
for letter in 'qwedz':
print('%s:%d'%(letter,b[letter]),end=',') b['x']=0
print(b)
print(list(b.elements()))#elements()返回一个迭代器,将生成Counter中的所有元素,但是不包括计数小于或者等于0的元素 string1 = '这是一段测试文文文字,这用来测试数据数数数结构常常判断数据是否可以正常使用,常用的正常的测试文章结果结构构造'
s = collections.Counter(string1)
for letter,count in s.most_common(3): #most_common()生成一个序列,其中包含n个最常遇到的输入值和相应的计数
print('%s:%d'%(letter,count),end='|') 结果:
q:2,w:3,e:2,d:1,z:0,Counter({'w': 3, 'q': 2, 'e': 2, 's': 1, 'a': 1, 'd': 1, 'x': 0})
['q', 'q', 's', 'e', 'e', 'w', 'w', 'w', 'a', 'd']
数:5|常:5|文:4|
#算术操作
c1 = collections.Counter('qqqwwweeedx')
c2 = collections.Counter(['q','q','w','w','e','e','d','v'])
print(c1-c2)#每次通过一次操作生成新的Counter时候,计数为0或者负数会被删除
print(c1+c2)
print(c1&c2)
print(c1|c2) 结果:
Counter({'x': 1, 'w': 1, 'e': 1, 'q': 1})
Counter({'e': 5, 'w': 5, 'q': 5, 'd': 2, 'x': 1, 'v': 1})
Counter({'w': 2, 'e': 2, 'q': 2, 'd': 1})
Counter({'e': 3, 'w': 3, 'q': 3, 'x': 1, 'd': 1, 'v': 1})

 defaultdict 初始化容器时候会先让调用者提前指定默认值

def default_factory():
return 'default value' d = collections.defaultdict(default_factory,foo='bar')
print(d)
print(d['foo'],d['bar'],d['par']) 结果:
defaultdict(<function default_factory at 0x00000233EF0B7F28>, {'foo': 'bar'})
bar default value default value

deque(双端队列),支持从任意一端增加和删除元素,更为常见的两种结构,栈与队列,就是双端队列的退化形式,其输入和输出限制在一端

d = collections.deque('asdzxc')
print(d,len(d),('left end:',d[0]),('right end',d[-1]))
d.remove('d')
print('remove(d):',d)#deque属于序列容器,支持list的一些操作 结果:
deque(['a', 's', 'd', 'z', 'x', 'c']) 6 ('left end:', 'a') ('right end', 'c')
remove(d): deque(['a', 's', 'z', 'x', 'c'])
# 填充
d1 = collections.deque()
d1.extend('abcdefg')#迭代处理其输入
print('extend:',d1)
d1.append('hijk')
print('append',d1)
d1.extendleft('lmn')
print('extendleft:',d1)
d1.appendleft('opq')
print('appendleft',d1) 结果:
extend: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
append deque(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'hijk'])
extendleft: deque(['n', 'm', 'l', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'hijk'])
appendleft deque(['opq', 'n', 'm', 'l', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'hijk'])
#使用,可以从任意一端取deque的元素
print('from right')
d = collections.deque('abcdefg')
while True:
try:
print(d.pop(),end=',')
except IndexError:
break
print()
print('from left')
n = collections.deque(range(6))
while True:
try:
print(n.popleft(),end=',')
except IndexError:
break 结果:
from right
g,f,e,d,c,b,a,
from left
0,1,2,3,4,5,
#使用不同线程同时从两端利用双端队列的内容
import threading
import time
candle = collections.deque(range(5))
def burn(direction,nextSource):
while True:
try:
next=nextSource()
except IndexError:
break
else:
print('%8s:%s'%(direction,next))
time.sleep(1) print('%8s done'%direction)
return left = threading.Thread(target=burn,args=('left',candle.popleft))
right = threading.Thread(target=burn,args=('right',candle.pop)) left.start()
right.start() left.join()
right.join() 结果:
left:0
right:4
right:3
left:1
left:2
right done
left done
#旋转,按照任意一个方向旋转,跳过一些元素
d = collections.deque(range(10))
print(d)
d.rotate(2)#使用正值,会从右端取数据移动到左端
print(d)
d.rotate(-4)#使用负值,会从左端取数据移动到右端
print(d) 结果:
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
deque([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])

 OrderedDict是一个字典的子类,可以记住其内容增加的顺序,是有序的


d = collections.OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3 for k,v in d.items():
print(k,v) d1 = collections.OrderedDict()
d1['a'] = 1
d1['b'] = 2
d1['c'] = 3 d2 = collections.OrderedDict()
d2['b'] = 2
d2['a'] = 1
d2['c'] = 3 print(d1==d2)
结果: 

a 1
b 2
c 3
False

python数据结构(一)的更多相关文章

  1. python数据结构与算法

    最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...

  2. python数据结构与算法——链表

    具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...

  3. python数据结构之图的实现

    python数据结构之图的实现,官方有一篇文章介绍,http://www.python.org/doc/essays/graphs.html 下面简要的介绍下: 比如有这么一张图: A -> B ...

  4. Python数据结构与算法--List和Dictionaries

    Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...

  5. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

  6. Python数据结构与循环语句

    # Python数据结构与循环语句:   首先编程是一项技能,类似跑步,期初不必在意细节,能使用起来就行,等学的游刃有余了再回过头来关注细节问题也不迟.  关于买书: 学会python之后,才需要买书 ...

  7. python数据结构之栈与队列

    python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...

  8. python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)

    python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...

  9. Python数据结构之四——set(集合)

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 经过几天的回顾和学习,我终于把Python 3.x中的基础知识介绍好啦.下面将要继续什么呢?让我想想先~~~嗯,还是 ...

  10. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

随机推荐

  1. Java实现 蓝桥杯VIP 算法训练 数位分离

    ** 算法训练 数位分离** 问题描述 编写一个程序,输入一个1000 以内的正整数,然后把这个整数的每一位数字都分离出来,并逐一地显示. 输入格式:输入只有一行,即一个1000以内的正整数. 输出格 ...

  2. Java实现第九届蓝桥杯字母阵列

    字母阵列 题目描述 仔细寻找,会发现:在下面的8x8的方阵中,隐藏着字母序列:"LANQIAO". SLANQIAO ZOEXCCGB MOAYWKHI BCCIPLJQ SLAN ...

  3. Java实现第八届蓝桥杯购物单

    购物单 题目描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打 ...

  4. java实现第六届蓝桥杯生成回文数

    生成回文数 所谓回文数就是左右对称的数字,比如: 585,5885,123321- 当然,单个的数字也可以算作是对称的. 小明发现了一种生成回文数的方法: 比如,取数字19,把它与自己的翻转数相加: ...

  5. java实现第八届蓝桥杯生命游戏

    生命游戏 题目描述 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的 ...

  6. java实现第四届蓝桥杯阶乘位数

    阶乘位数 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格 ...

  7. CDN百科 | 假如没有CDN,网络世界会变成什么样?

    很多人都知道CDN是内容分发加速,所谓内容分发,就是将本来位于源站的内容分发到全国各地的节点,方便用户去就近访问所需的内容.随着移动互联网.云计算等一代代技术变革,CDN已经成为了缓解互联网网络拥塞. ...

  8. Android数据库框架-ORMLite

    参考资料 Android ORMLite 框架的入门用法 Android 快速开发系列 ORMLite 框架最佳实践 添加依赖 compile 'com.j256.ormlite:ormlite-an ...

  9. javascript 面向对象学习(一)——构造函数

    最近在学习设计模式,找了很多资料也没有看懂,看到怀疑智商,怀疑人生,思来想去还是把锅甩到基础不够扎实上.虽然原型继承.闭包.构造函数也都有学习过,但理解得不够透彻,影响到后续提高.这次重新开始学习,一 ...

  10. 学而思Java开发岗位面试

    去学而思培优面试了. 有四道笔试题,后面会整理做法. 1.给一个文件夹,用递归的方式统计这个目录及其子目录不同文件类型的个数. 如,输出:jpg:几个文件,txt:几个文件... 2.不适用加减乘除, ...