python数据结构(一)
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数据结构(一)的更多相关文章
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- python数据结构与算法——链表
具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...
- python数据结构之图的实现
python数据结构之图的实现,官方有一篇文章介绍,http://www.python.org/doc/essays/graphs.html 下面简要的介绍下: 比如有这么一张图: A -> B ...
- Python数据结构与算法--List和Dictionaries
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- Python数据结构与循环语句
# Python数据结构与循环语句: 首先编程是一项技能,类似跑步,期初不必在意细节,能使用起来就行,等学的游刃有余了再回过头来关注细节问题也不迟. 关于买书: 学会python之后,才需要买书 ...
- python数据结构之栈与队列
python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...
- python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)
python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...
- Python数据结构之四——set(集合)
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 经过几天的回顾和学习,我终于把Python 3.x中的基础知识介绍好啦.下面将要继续什么呢?让我想想先~~~嗯,还是 ...
- Python数据结构之单链表
Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...
随机推荐
- Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
算法训练 9-7链表数据求和操作 时间限制:1.0s 内存限制:512.0MB 读入10个复数,建立对应链表,然后求所有复数的和. 样例输入 1 2 1 3 4 5 2 3 3 1 2 1 4 2 2 ...
- Java实现 LeetCode 394 字符串解码
394. 字符串解码 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k ...
- Java实现 洛谷 P1280 尼克的任务
import java.util.Scanner; public class Main { public static class edg{ private int to; private int n ...
- 一文带你快速搞懂动态字符串SDS,面试不再懵逼
目录 redis源码分析系列文章 前言 API使用 embstr和raw的区别 SDSHdr的定义 SDS具体逻辑图 SDS的优势 更快速的获取字符串长度 数据安全,不会截断 SDS关键代码分析 获取 ...
- 95题--不同的二叉搜索树II(java、中等难度)
题目描述:给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 . 示例如下: 分析:这一题需要对比LeetCode96题来分析:https://www.cnblogs.com/K ...
- Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Api (3) - Stream的终端操作
Stream API Java8中有两大最为重要的改变:第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*). Stream 是 Java8 中处 ...
- 字符串相同ID竟然不同!!!
- Django 构建模板form表单的两种方法
通常情况下,我们想构建一张表单时会在模板文件login.html中写入 <form action="/your-name/" method="post"& ...
- 今天抠图,Python实现一键换底片!想换什么换什么(附源码)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 生活中我们会拍很多的证件照,有的要求红底,有的是白底,有的是蓝底,今天不通 ...
- MySQL示例数据库导入_1
做个测试需要有适当量的数据库,于是找到了下面这个MySQL(超过30w记录), 1)先Git clone https://github.com/datacharmer/test_db ...