也可以在我的个人博客上阅读

一、collections模块

1. Counter

Counter是⼀个计数器,主要⽤统计字符的数量,之前如果我们要统计字符串的话要写如下算法:

s = 'Wed Nov 14 08:58:45 CST 2018'

dic = {}

for c in s:
dic[c] = dic.setdefault(c, 0) + 1 print(dic) # 结果:
# {'W': 1, 'e': 1, 'd': 1, ' ': 5, 'N': 1, 'o': 1, 'v': 1, '1': 2, '4': 2, '0': 2, '8': 3, ':': 2, '5': 2, 'C': 1, 'S': 1, 'T': 1, '2': 1}

但是使用Count函数要简单的多:

from collections import Counter

s = 'Wed Nov 14 08:58:45 CST 2018'
c = Counter(s)
for k in c:
print(f'{k}: {c[k]}') # 结果:
# W: 1
# e: 1
# d: 1
# : 5
# N: 1
# o: 1
# v: 1
# 1: 2
# 4: 2
# 0: 2
# 8: 3
# :: 2
# 5: 2
# C: 1
# S: 1
# T: 1
# 2: 1

2. 双向队列

这里的双向队列的操作其实很简单,但是我们需要明确两个概念:栈和队列

  1. 栈:栈就像是一个桶,可以往里面放东西和从里面把东西拿出来,但是我们在放当西的时候(push)会发现最开始放进去的东西总是在最下面,而最后放的东西会在最上面,于是我们从里面拿东西(pop)的时候都是从最上面开始拿的。这就是栈所遵循的先进后出的原则:FILO(Last In First Out)

由于python中并没有栈的实现,这里写一个简单版的栈来看一下栈实现的效果:

class Node:
def __init__(self, value): # 创建了一个节点类,代表栈中每一个元素
self.value = value
self.next = None # 这里的next指向下一个元素的位置 class Stack:
def __init__(self):
self.top = None # 初始化的时候栈顶元素默认值设置为None def push(self, val):
node = Node(val) # push的时候先创建一个新的节点
node.next = self.top # 把新节点的next指向原来的栈顶元素
self.top = node # 把添加的新节点标记为栈顶节点 def pop(self):
if self.top is not None: # 判断栈中是否存在元素,如果存在再抛出栈顶元素
top = self.top # 先把栈顶元素赋值给一个临时变量
self.top = self.top.next # 再把栈顶元素指向自己的下一个节点
return top.value # 抛出之前的栈顶元素(即临时变量top)
return None

以上代码就是一个简单版本栈的实现,我们可以来测试一下:

s = Stack()
s.push('馒头一号')
s.push('馒头二号')
s.push('馒头三号')
s.push('馒头四号')
s.push('馒头五号') print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop()) # 结果:
# 馒头五号
# 馒头四号
# 馒头三号
# 馒头二号
# 馒头一号
# None

从上可以看出,栈始终遵循着先进后出的原则。

  1. 队列

在python中已经有了队列的实现,我们来看看对列的特性:

from queue import Queue

q = Queue()

q.put("李嘉诚")
q.put("张开")
q.put("张毅")
print(q) # 这里的q返回的是一个Queue对象
print(q.get())
print(q.get())
print(q.get()) # 结果:
# <queue.Queue object at 0x000001DD79D68630>
# 李嘉诚
# 张开
# 张毅

如果队列⾥没有元素了. 再也就拿不出来元素了. 此时程序会阻塞.

队列的特性就像是我们买火⻋票排队的情景,排在前面的就先买然后买完出来,排在后面就后面买,队列遵循的是先进先出的原则:FIFO(first in first out)。

  1. 双向队列

然后我们再来看下双向队列deque:

from collections import deque

q = deque()

q.append('高圆圆')
q.append('江疏影')
q.appendleft('赵又廷')
q.appendleft('赵丽颖')
# q: 赵丽颖 赵又廷 高圆圆 江疏影 print(q.pop())
print(q.popleft())
print(q.popleft()) # 结果:
# 江疏影
# 赵丽颖
# 赵又廷

3. namedtuple 命名元组

命名元组,顾名思义即给元组内的元素进⾏命名,比如我们说(x, y) 这是⼀个元组同时,我们还可以认为这是⼀个点坐标。这时,我们就可以使⽤namedtuple对元素进⾏命名。

from collections import namedtuple

t = namedtuple('Point', ['x', 'y', 'z', 'u'])

p = t(10, 100, 34, 89)
print(p.x) # 可以像访问实例变量一样用 . 访问
print(p.y)
print(p)
print(p[1]) # 也可以用下标访问
print(p[0])
print('--------------')
for i in p: # 也可以对这个对象做循环遍历
print(i) # 结果:
# 10
# 100
# Point(x=10, y=100, z=34, u=89)
# 100
# 10
# --------------
# 10
# 100
# 34
# 89

4. orderdict和defaultdict

orderdict:字典的key默认是⽆序的,⽽OrderedDict是有序的(自3.6的版本后已经没有太大的差异了,打印的时候默认也是顺序的)

from collections import OrderedDict

od = OrderedDict({'a':1, 'c':3, 'b':2})

print(od)
print(od['a']) # 结果:
# OrderedDict([('a', 1), ('c', 3), ('b', 2)])
# 1

defaultdict:可以给字典设置默认值,当key不存在时,直接获取默认值:

from collections import defaultdict

lst = [11, 22, 33, 44, 55, 66, 77, 88, 99]
d = defaultdict(list) # 传入默认值list for i in lst:
if i < 66:
d['key1'].append(i)
else:
d['key'].append(i) print(d) # 结果:
# defaultdict(<class 'list'>, {'key1': [11, 22, 33, 44, 55], 'key': [66, 77, 88, 99]})

二、时间模块

时间模块是我们要熟记的,对我们后期的项目开发来说很重要,要使用时间模块首先我们要导入这个模块:

#常用方法
time.sleep(secs) # (线程)推迟指定的时间运行。单位为秒。 time.time() # 获取当前时间戳
# 1542166453.105443

在python中时间分成三种表现形式:

  1. 时间戳(timestamp):时间戳使⽤的是从1970年01⽉01⽇00点00分00秒到现在⼀共经过了多少秒... 我们运行type(time.time())获取到的就是时间戳了,使⽤float来表⽰。

  2. 格式化时间(strftime):这个时间可以根据我们的需要对时间进⾏任意的格式化,具体的格式如下表:

格式 格式说明 取值范围或其他
%y 两位数的年份表示 00-99
%Y 四位数的年份表示 000-9999
%m 月份 01-12
%d 月内中的一天 0-31
%H 24小时制小时数 0-23
%I 12小时制小时数 01-12
%M 分钟数 00=59
%S 00-59
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天 001-366
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数,星期天为星期的开始 00-53
%w 星期(0-6),星期天为星期的开始 0-6
%W 一年中的星期数,星期一为星期的开始 00-53
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
  1. 结构化时间(struct_time):这个时间主要可以把时间进⾏分类划分. 比如. 1970年01⽉01⽇ 00点00分00秒 这个时间可以被细分为年, ⽉, ⽇.....⼀⼤堆东⻄:
索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为0

我们先看下这几种时间表现形式:

In [1]: import time

In [2]: time.time()                             # 查看当前时间的时间戳
Out[2]: 1542447516.5602913 In [3]: time.localtime() # 查看当前的结构化时间
Out[3]: time.struct_time(tm_year=2018, tm_mon=11, tm_mday=17, tm_hour=17, tm_min=38, tm_sec=43, tm_wday=5, tm_yday=321, tm_isdst=0) In [4]: time.strftime('%Y-%m-%d %I:%M:%S %p') # 查看当前的格式化时间
Out[4]: '2018-11-17 05:39:10 PM'

时间模块常用的几个方法:

time.sleep(s)                                   # 挂起进程,让程序睡眠s秒
time.time() # 查看当前的时间戳
time.strftime(format[, tuple]) # 把格式化时间转化成格式化时间,默认转换当前时间
time.strptime(string, format) # 以指定的format格式把格式化时间转换成结构化时间
time.gmtime(timestamp) # UTC时间,与英国伦敦当地时间一致
time.localtime(timestamp) # #当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时
time.mktime(struct_time) # 把结构化时间转化成时间戳

时间戳、结构化时间和格式化时间的关系和转化:

# 时间戳转化为格式化时间
st1 = 18888888
struck_time = time.localtime(st1)
print(struck_time)
# time.struct_time(tm_year=1970, tm_mon=8, tm_mday=7, tm_hour=22, tm_min=54, tm_sec=48, tm_wday=4, tm_yday=219, tm_isdst=0) # 格式化时间转化成时间戳
st2 = time.mktime(struck_time)
print(st2)
# 18888888.0 # 格式化时间转换成结构化时间
ft1 = '2018-11-19 20:34'
st1 = time.strptime(ft1, '%Y-%m-%d %H:%M')
print(st1)
# time.struct_time(tm_year=2018, tm_mon=11, tm_mday=19, tm_hour=20, tm_min=34, tm_sec=0, tm_wday=0, tm_yday=323, tm_isdst=-1) # 结构化时间转换成格式化时间
ft2 = time.strftime('%Y-%m-%d %H:%M:%S', st1)
print(ft2)
# 2018-11-19 20:34:00

时间戳和格式化时间的互转(最常用):

# 时间戳转成格式化时间:
ft3 = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1888888888))
print(ft3)
# 2029-11-09 11:21:28 # 格式化时间转成时间戳:
st3 = time.mktime(time.strptime(ft3, '%Y-%m-%d %H:%M:%S'))
print(st3)
# 1888888888.0

python学习笔记:第21天 常用内置模块之collections和time的更多相关文章

  1. Python学习笔记(四十一)— 内置模块(10)urllib

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432688314 ...

  2. Python学习笔记(四十)— 内置模块(9)HTMLParser

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432002312 ...

  3. python学习笔记(12)常用模块

    一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...

  4. Python学习笔记五:字符串常用操作,字典,三级菜单实例

    字符串常用操作 7月19日,7月20日 ,7月22日,7月29日,8月29日,2月29日 首字母大写:a_str.capitalize() 统计字符串个数:a_str.count(“x”) 输出字符, ...

  5. python学习笔记(十)常用模块

    import os print(os.getcwd())#取当前工作目录,绝对路径 print(os.chdir("../"))#更改当前目录,.代表当前目录,..代表上一级目录 ...

  6. python学习笔记(13)常用模块列表总结

    os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.chdir() 改变当前工作 ...

  7. python学习笔记(四)- 常用的字符串的方法

    一.常用的字符串方法(一):(字符串是不能被修改的) 1)a.strip()   #默认去掉字符串两边的空格和换行符 a = ' 字符串 \n\n ' c = a.strip() a.lstrip() ...

  8. python学习笔记(21)--新建html乱码(给每本漫画生成一个html)

    说明: 1. open("index.html","w",encoding="utf-8"),open的第三个参数可以设置编码格式. 2. ...

  9. Python 学习笔记(五)常用函数

    Python内建函数 四舍五入: round() 绝对值: abs() >>> round(1.543,2) 保留两位小数,四舍五入为1.54 1.54 >>> r ...

随机推荐

  1. 正则去除html标签属性保留指定标签

    /// <summary> /// 去除标签里面的属性保留IMG标签属性 /// </summary> /// <param name="strText&quo ...

  2. 绘制播放音乐时的音波图形的View

    绘制播放音乐时的音波图形的View 这个效果类似于这个哦: 效果如下: 源码: MusicView.h 与 MusicView.m // // MusicView.h // Music // // C ...

  3. 用CSS写扫描二维码图标

    代码如下: <style>.icon{margin:300px;width:30px;height:30px;position:relative}.icon .b{border:2px s ...

  4. IEEP部署企业级网络工程-网络故障-环路故障

    网络故障 1.环路故障 概念 1).以太网是一个支持广播的网络, 在没有环路的环境中,广播报文在网络中以泛洪的形式被送达到网络的第一个角落,以保证每个设备都能够接受到它.每台二层设备在接收到广播报文以 ...

  5. WAKE-WIN10-SOFT-环境

    操作系统名称 Microsoft Windows 10 专业版版本 10.0.14393 版本 14393其他操作系统描述 没有资料操作系统制造商 Microsoft Corporation系统名称 ...

  6. 一个较复杂的执行redis的lue脚本

  7. 《SQL必知必会》总结

    目录   第1章 了解SQL 第2章 检索数据 第3章 排序检索数据 第4章 过滤数据 第5章 高级数据过滤 第6章 用通配符进行过滤 第7章 创建计算字段 第8章 使用数据处理函数 第9章 汇总数据 ...

  8. std::vector的内存释放

    先上一段代码 using namespace std; class A{ public: ~A(){ cout << "deconstruct"; }; }; #inc ...

  9. 折腾apt源的时候发生的错误

    在折腾Ubuntu源的时候,把新的源替换进去,然后 sudo apt-get update 之后报错: W: Unknown Multi-Arch type 'no' for package 'com ...

  10. 2018 Multi-University Training Contest 4 Problem K. Expression in Memories 【模拟】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6342 Problem K. Expression in Memories Time Limit: 200 ...