zoukankan      html  css  js  c++  java
  • python模块之collections random

    collections

    在内置数据类型(list, dict, tuple, set)的基础上,collections提供了几个额外的数据类型: Counter, deque, Orderdict, defultdict, namedtuple等

    1. namedtuple: 生成可以通过名字访问的元组,类似之前的结构化时间

    2. deque: 双向队列

    3. Counter: 计数器

    4. OrderDict: 有序字典

    5. defaultdict: 带有默认值的字典

    nametuple

    我们要描述一个长方体,就可以用namedtuple

    1 from collections import namedtuple
    2 
    3 cube = namedtuple("cube", ["length", "width", "height"])
    4 c1 = cube(5, 4, 3)
    5 print(c1)   # cube(length=5, width=4, height=3)
    6 print(c1.length)   # 5
    7 print(c1.height)   # 3

     

    deque

    deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈,deque类似于列表,也有append, pop等方法

    from collections import deque
    q = deque(["a", "b", "c"])
    print(q)   # deque(['a', 'b', 'c'])
    # 添加
    q.append("d")   # 默认从右边添加
    print(q)   # deque(['a', 'b', 'c', 'd'])
    q.appendleft("e")
    print(q)   # deque(['e', 'a', 'b', 'c', 'd'])
    
    # 删除
    q.pop()   # 默认从右边删,不能指定元素删
    print(q)  # deque(['e', 'a', 'b', 'c'])
    q.popleft()  # 默认从左边删
    print(q)    # deque(['a', 'b', 'c'])
    
    # q.pop("b")  # TypeError: pop() takes no arguments (1 given)
    
    print(q.count("a"))   # 1
    q.remove("b")   # 指定元素删
    print(q)   # deque(['a', 'c'])

    OrderDict

    使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderDict,不过python3.6版本以后字典已经是有序的了,所以这个已经用处不大了。注意这里的key有序是指key按照创建字典或插入值的顺序来排

    from collections import OrderedDict
    od = OrderedDict()
    od[1] = "a"
    od[2] = "b"
    od[3] = "c"
    print(od)    # OrderedDict([(1, 'a'), (2, 'b'), (3, 'c')])

    defaultdict

    来看一个例子:有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

    原生字典解决办法

    l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
    dic = dict()
    for i in l1:
        if i > 66:
            if "k1" not in dic:
                dic["k1"] = []
            dic["k1"].append(i)
        elif i < 66:
            if "k2" not in dic:
                dic["k2"] = []
            dic["k2"].append(i)
    print(dic)    # {'k2': [11, 22, 33, 44, 55], 'k1': [77, 88, 99, 90]}
    View Code

    defaultdict解决办法

    from collections import defaultdict
    l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
    dd = defaultdict(k1=[], k2=[])
    # print(dd)    # defaultdict(None, {'k1': [], 'k2': []})
    for i in l1:
        if i > 66:
            dd["k1"].append(i)
        elif i < 66:
            dd["k2"].append(i)
    print(dd)    # defaultdict(None, {'k1': [77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55]})
    View Code

    Counter

    Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似

    from collections import Counter
    lst = [1, 2, 3, 3, 2, 4, 5, 3, 1, 0, 0]
    print(Counter(lst))   # Counter({3: 3, 1: 2, 2: 2, 0: 2, 4: 1, 5: 1})
    s = "afshkfhsdjhfakjhsdhajkd"
    print(Counter(s))   # Counter({'h': 5, 'a': 3, 'f': 3, 's': 3, 'k': 3, 'd': 3, 'j': 3})

    Random

    所有与随机的东西都在random模块中

    def v_code():
        """
        用于生成随机验证码
        :return: None
        """
        code = ''
        for i in range(4):
            num = random.randint(0, 9)
            alf = chr(random.randint(65, 90))
            add = random.choice([num, alf])
            code = "".join([code, str(add)])
    
        return code
    
    
    print(v_code())  # 0V28
  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/zzliu/p/10267659.html
Copyright © 2011-2022 走看看