关于deque的使用

collections.deque([list[, max_length]])

# 不限定长度,可随意添加没有上限

>>> from collections import deque
>>> q = deque()
>>> q.append(1)
>>> q
deque([1])

# 定义限定的list长度,当list中的值超过限定的长度之后,会从添加端的另一侧删除参数超出部分

# 使用append()从右侧添加数据,如果添加数据满了,会从左侧删除超出部分的数据

>>> q = deque([], 5) # 添加到[]中,限定长度为5
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q.append(4)
>>> q.append(5)
>>> q
deque([1, 2, 3, 4, 5], maxlen=5)
>>> q.append(6)
>>> q
deque([2, 3, 4, 5, 6], maxlen=5)

# 使用appendleft()从左侧添加数据,如果数据溢出,那么从右侧删除数据

>>> q
deque([2, 3, 4, 5, 6], maxlen=5)
>>> q.appendleft(10)
>>> q
deque([10, 2, 3, 4, 5], maxlen=5)

# 使用pop()从右侧弹出一个元素

>>> q
deque([10, 2, 3, 4, 5], maxlen=5)
>>> q.pop()
5

# 使用popleft()从左侧弹出一个元素

>>> q
deque([10, 2, 3, 4], maxlen=5)
>>> q.popleft()
10

# 使用reverse()进行所有元素的翻转

>>> q
deque([2, 3, 4], maxlen=5)
>>> q.reverse()
>>> q
deque([4, 3, 2], maxlen=5)

# index(x[, start[, end]])返回元素的位置

>>> q
deque([4, 3, 2], maxlen=5)
>>> q.index(3)
1

# count(x)计算数量

>>> q
deque([1, 5, 3, 2, 2], maxlen=5)
>>> q.count(2) # 计算等于2的个数
2

# clear()进行清空list

>>> q
deque([1, 5, 3, 2, 2], maxlen=5)
>>> q.clear()
>>> q
deque([], maxlen=5)

# 使用copy()函数进行复制

>>> q
deque([7, 3, 6, 1, 43, 6], maxlen=6)
>>> list2 = q.copy()
>>> list2
deque([7, 3, 6, 1, 43, 6], maxlen=6)

# extend()批量添加元素(非单个添加),默认右侧

>>> q
deque([7, 3, 6, 1, 43, 6], maxlen=6)
>>> list3 = [1,2,4]
>>> q.extend(list3)
>>> q
deque([1, 43, 6, 1, 2, 4], maxlen=6)

# extendleft()左侧批量添加(值得注意的是,添加的结果是按照批量添加的那个list顺序的反顺序,原因是对于[1,6,4]每个元素先添加1,再添加6,再添加4,而每个添加的元素都是放在最左边)

>>> q
deque([1, 43, 6, 1, 2, 4], maxlen=6)
>>> q.extendleft([1,6,4]) # 添加[1,6,4]结果添加进去是[4,6,1]
>>> q
deque([4, 6, 1, 1, 43, 6], maxlen=6)

# 使用remove()进行删除元素

>>> q
deque([4, 6, 1, 1, 43, 6], maxlen=6)
>>> q.remove(43)
>>> q
deque([4, 6, 1, 1, 6], maxlen=6)

# 使用rotate()进行旋转list,默认旋转1。这个旋转呢,可以这样理解将list整体往右移动,超出部分直接移动到最左边

>>> q
deque([6, 4, 6, 1, 1], maxlen=6)
>>> q.rotate(2)
>>> q
deque([1, 1, 6, 4, 6], maxlen=6)

关于defaultdict()快捷简便构造多维list

>>> s
[('a', ''), ('b', ''), ('c', ''), ('a', ''), ('b', ''), ('a', '')]
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for key, value in s:
... d[key].append(value)
...
>>> d
defaultdict(<class 'list'>, {'a': ['', '', ''], 'b': ['', ''], 'c': ['']})

# 不使用defaultdict

>>> s
[('a', ''), ('b', ''), ('c', ''), ('a', ''), ('b', ''), ('a', '')]
>>> d = {}
>>> for key, value in s:
... if key not in d:
... d[key] = []
... d[key].append(value)
...
>>> d
{'a': ['', '', ''], 'b': ['', ''], 'c': ['']}

# 使用OrderedDict()设置有序字典

# 设置字典

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['a'] = 1
>>> d['b'] = 2
>>> d['c'] = 3

# popitem([last=True]) 删除最右边的那个键值对,如果last=False,那么删除最左边

>>> d.popitem()
('c', 3)
>>> d
OrderedDict([('a', 1), ('b', 2)])

# move_to_end(x[ ,last=True]) # 将键为x的键值对移动到末尾,如果last=False,那么移动到最前面

>>> d
OrderedDict([('a', 1), ('b', 2)])
>>> d.move_to_end('a')
>>> d
OrderedDict([('b', 2), ('a', 1)])

关于collections.namedtuple()

from collections import namedtuple
# 使用namedtuple构建一个Stock类,[]部分是属性
Stock = namedtuple('Stock', ['name', 'age', 'sex'])
sub = Stock('namejr', '', '男') # 进行属性赋值
print(sub.name)
print(sub.age)
print(sub.sex)
"""
D:\笔记\python电子书\Python3>python index.py
namejr
22

"""

namedtuple._make()

from collections import namedtuple
# 使用namedtuple构建一个Stock类,[]部分是属性
Stock = namedtuple('Stock', ['name', 'age', 'sex'])
info = ['namejr', '', '男']
# 创建一个新实例
newStock = Stock._make(info)
print(newStock)
"""
D:\笔记\python电子书\Python3>python index.py
Stock(name='namejr', age='22', sex='男')
"""

namedtuple._asdict() 将namedtuple创建的类的属性创建一个新的有序字典

from collections import namedtuple
# 使用namedtuple构建一个Stock类,[]部分是属性
Stock = namedtuple('Stock', ['name', 'age', 'sex'])
sub = Stock('namejr', '', '男')
dict1 = sub._asdict() # 创建一个新的有序的字典序列(ordereddict)
print(dict1)
"""
D:\笔记\python电子书\Python3>python index.py
OrderedDict([('name', 'namejr'), ('age', '22'), ('sex', '男')])
"""

namedtuple._replace() namedtuple的属性值就像tuple一样建立就无法改变,如果想使用原来的namedtuple创建的类的全部字段和大部分数据就可以namedtuple._replace

namedtuple._replace()是用来创建一个新的类,而且还可以更改属性值

from collections import namedtuple
# 使用namedtuple构建一个Stock类,[]部分是属性
Stock = namedtuple('Stock', ['name', 'age', 'sex'])
sub = Stock('namejr', '', '男')
sub1 = sub._replace(name='abc') # 将name的属性值更换为'abc'
print(sub1)
"""
D:\笔记\python电子书\Python3>python index.py
Stock(name='abc', age='22', sex='男')
"""

namedtuple._fields()查看字段的属性

from collections import namedtuple
# 使用namedtuple构建一个Stock类,[]部分是属性
Stock = namedtuple('Stock', ['name', 'age', 'sex'])
sub = Stock('namejr', '', '男')
print(sub._fields) # 查看属性字段
"""
D:\笔记\python电子书\Python3>python index.py
('name', 'age', 'sex')
"""

当然他还可以用来做字段合并

from collections import namedtuple
# 使用namedtuple构建一个Stock类,[]部分是属性
Stock = namedtuple('Stock', ['name', 'age', 'sex'])
Color = namedtuple('Color', ['one', 'two'])
Sums = namedtuple('Sums', Stock._fields + Color._fields)
sums = Sums('abc', '', '女', '', '')
print(sums)
"""
D:\笔记\python电子书\Python3>python index.py
Sums(name='abc', age='10', sex='女', one='1', two='2')
"""

namedtuple._fields_defaults

from collections import namedtuple
# 使用namedtuple构建一个Stock类,[]部分是属性
Stock = namedtuple('Stock', ['name', 'age', 'sex'], defaults=[0]) # 从后往前操作,为字段设置默认值
print(Stock._fields_defaults)

将namedtuple与csv联合使用(使用sqlite3同理):

from collections import namedtuple
import csv
Stock = namedtuple('Stock', ['name', 'age', 'sex']) # 创建类和属性
# 使用map()函数将csv读取出来的内容进行namedtuple._make创建类的新实例
for emp in map(Stock._make,csv.reader(open('one.csv', 'r', encoding="utf-8"))):
print(emp.name, emp.age, emp.sex)

关于collections.ChainMap()

就是可以将多个字典进行合并,形成一个新的字典,如果含有同键的属性,使用前面优先显示原则,如果前面的被删除了,那么才显示后面同键的值

from collections import ChainMap
a1 = {'a':1, 'b':2, 'c':3}
b1 = {'d':4, 'a':5, 'c':6}
c1 = ChainMap(a1,b1)
print(c1)
"""
D:\笔记\python电子书\Python3>python index.py
ChainMap({'a': 1, 'b': 2, 'c': 3}, {'d': 4, 'a': 5, 'c': 6})
"""
# 访问的时候,前面的数据会覆盖后面的数据
print(c1['a']) # 输出"1"
del c1['a'] # 删除第一个a
print(c1['a']) # 输出"5"

new_child()和parents()的使用

>>> from collections import ChainMap
>>> values = ChainMap()
>>> values['x'] = 1 # 设置当前的字典
>>> values
ChainMap({'x': 1}) # 创建一个新的字典
>>> values = values.new_child()
>>> values['x'] = 2 # 在新创建的字典里面的添加元素
>>> values
ChainMap({'x': 2}, {'x': 1}) # 如果不是创建新的字典,那么会在原来的基础上添加元素
>>> values['y'] = 3
>>> values
ChainMap({'x': 2, 'y': 3}, {'x': 1})
>>> values['x'] # 当前字典是{'x': 2, 'y': 3}
2 # 查看父节点
>>> values = values.parents
>>> values
ChainMap({'x': 1})

deque/defaultdict/orderedict/collections.namedtuple()/collections.ChainMap() 笔记的更多相关文章

  1. python中的collections.namedtuple

    简介 collections.namedtuple是一个工厂方法,它可以动态的创建一个继承tuple的子类.跟tuple相比,返回的子类可以使用名称来访问元素. 使用方法 用一个例子来介绍: > ...

  2. collections.namedtuple()命名序列元素

    ## collections.namedtuple()命名序列元素 from collections import namedtuple Student = namedtuple("Stud ...

  3. python collections模块 之 ChainMap

    ChainMap提供了一种多个字典整合的方式,它没有去合并这些字典,而是将这些字典放在一个 maps (一个列表)里,内部实现了很多 dict 的方法,大部分 dict 的方法,ChainMap 都能 ...

  4. Collections.unmodifiableMap,Collections.unmodifiableList,Collections.unmodifiableSet作用及源码解析

    在文章:Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析中mybatis的源码中用到了Collections.unmodifiableList方法,其实还有unmodifiabl ...

  5. $python collections库

    collections库是python内置的集合库,本文主要讲解以下5种数据结构的用法: namedtuple 命名元组,是tuple的子类 deque 双向列表 defaultdict 有默认值的字 ...

  6. 笔记-python-standard library-8.3.collections

    笔记-python-standard library-8.3.collections 1.      collections简介 Source code: Lib/collections/__init ...

  7. collections 数据结构模块namedtuple

    namedtuple类 导入模块 from collections import namedtuple 使用方法及说明 #pycharm 里按住 ctrl键点击 collections可查看源码 #c ...

  8. 笔记——collections模块

    collections模块 collections模块在内置数据类型(dict.list.set.tuple)的基础上,还提供了几个额外的数据类型:ChainMap.Counter.deque.def ...

  9. Python_Day_05 计数器(counter),有序字典(OrderDict),默认字典(defaultdict),可命名元祖(namedtuple),双向队列(deque),单项队列(deuqe.Queue)

    Counter(计数器) 是一个字典的子类,存储形式同样为字典,其中存储的键为字典的元素,值为元素出现的次数,在使用之前我们需要先导入文件 import collections 初始化一个计数器 im ...

随机推荐

  1. GIL 相关 和进程池

    #GIL (global interpreter Lock) #全局解释器锁 :锁是为了避免资源竞争造成数据错乱 #当一个py启动后 会先执行主线程中的代码#在以上代码中有启动了子线程 子线程的任务还 ...

  2. IDEA如何自动生成testNG的测试报告?

    问:eclipse会在test-output目录下自动生成测试报告,想知道IDEA是只可以在控制台那里点击导出手动生成报告么? 答:编译器选择Edit Configuration,找到测试项,找到Li ...

  3. nginx 之 proxy_pass详解

    在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径:如果没有/,表示相对路径,把匹配的路径部分也给代理走.     假设下面四种情况分别用 h ...

  4. [转]Introduction to Learning to Trade with Reinforcement Learning

    Introduction to Learning to Trade with Reinforcement Learning http://www.wildml.com/2018/02/introduc ...

  5. PHP安全之Web攻击(转)

    一.SQL注入攻击(SQL Injection) 攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态 ...

  6. 【leetcode】409. Longest Palindrome

    problem 409. Longest Palindrome solution1: class Solution { public: int longestPalindrome(string s) ...

  7. Java中的Arrays类使用详解

    首先先创建一个打印数组的方法,方便后面直接使用 public static void output(int []a) { for(int i=0;i<a.length;i++) { System ...

  8. MAC使用pycharm上传代码到Github上

    本人的电脑已经在GitHub中添加成功了SSH keys! 以下为在pycharm中上传代码到Github的步骤. Step1:打开pycharm,preferences---plugins(插件)选 ...

  9. Structural Features for Predicting the Linguistic Quality of Text: Applications to Machine Translation, Automatic Summarization and Human-Authored Text -paper

    abstract句子结构是文本语言质量的关键,我们记录了以下实验结果:句法短语统计和其他结构特征对文本方面的预测能力.手工评估的句子fluency流利度用于机器翻译评估和文本摘要质量的评估是黄金准则. ...

  10. PS学习之餐饮行业修图

    素材 红烧肉 生菜 洋葱 目标效果 开始操作: 首先打开PS,将红烧肉素材放入  将红烧肉单另扣下来(用快随选择工具 按住Alt键是减选  抠图时  将画布放大 细细的扣) 然后创建一个和当前选区大小 ...