• deque/defaultdict/orderedict/collections.namedtuple()/collections.ChainMap() 笔记


    关于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', '1'), ('b', '2'), ('c', '3'), ('a', '4'), ('b', '5'), ('a', '6')]
    >>> from collections import defaultdict
    >>> d = defaultdict(list)
    >>> for key, value in s:
    ... d[key].append(value)
    ...
    >>> d
    defaultdict(<class 'list'>, {'a': ['1', '4', '6'], 'b': ['2', '5'], 'c': ['3']})

    # 不使用defaultdict

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


    # 使用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', '22', '') # 进行属性赋值
    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', '22', '']
    # 创建一个新实例
    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', '22', '')
    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', '22', '')
    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', '22', '')
    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', '10', '', '1', '2')
    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})
  • 相关阅读:
    Linux02--文件系统与磁盘管理
    Android02-Activity01
    Android01-概述
    LeetCode | Binary Tree Level Order Traversal II
    LeetCode | Binary Tree Level Order Traversal
    LeetCode | Binary Tree Postorder Traversal
    LeetCode | Binary Tree Inorder Traversal
    LeetCode | Binary Tree Preorder Traversal
    LeetCode | Symmetric Tree
    LeetCode | Balanced Binary Tree
  • 原文地址:https://www.cnblogs.com/namejr/p/9948376.html
Copyright © 2020-2023  润新知