美文网首页初学者
Python基础系列讲解——内置库之collections的使用

Python基础系列讲解——内置库之collections的使用

作者: f6082dea8055 | 来源:发表于2019-09-27 17:45 被阅读0次

    Python中有很多好用的内置的模块,比如datatime、json等等,本文介绍下collections模块的使用。使用collections模块时,首先要导入模块,如下所示:

    import collections

    我们首先介绍下OrderedDict模块的使用。在Python3.5(含)中字典是无序的,即不会按照使用者插入的顺序排序,如下所示,打印结果我们发现输出并没有按输入的顺序输出。

    x = dict() # 无序字典

    x['stock1'] = "600213"

    x['stock2'] = "600223"

    x['stock3'] = "600233"

    print(x) # {'stock1': '600213', 'stock3': '600233', 'stock2': '600223'}

    使用operator.itemgetter对字典排序后,返回的是一个list变量,而不是字典,倘若再将这个list转换为字典后,会发现又变回了无序字典。如下所示:

    x = {"stock1": "600213", "stock2": "600223", "stock3": "600233"}

    sorted_x = sorted(x.items(), key=operator.itemgetter(0))

    print(type(x)) #

    print(type(sorted_x)) #

    print(dict(sorted_x)) # {'stock1': '600213', 'stock3': '600233', 'stock2': '600223'}

    如果要使字典保持我们插入的顺序怎么办呢?可以用collections.OrderedDict来初始化字典,使无序字典成为有序字典,如下所示:

    x = OrderedDict()

    x['stock1'] = "600213"

    x['stock2'] = "600223"

    x['stock3'] = "600233"

    print(x) # OrderedDict([('stock1', '600213'), ('stock2', '600223'), ('stock3', '600233')])

    print(type(x)) #

    OrderedDict生成的字典支持如下属性:

    # values() 获取字典所有的value,返回一个列表

    print(x.values()) # odict_values(['600213', '600223', '600233'])

    # setdefault() 获取指定key的value,如果key不存在,则创建

    val = x.setdefault('stock4')

    print(val, x) # None OrderedDict([('stock1', '600213'), ('stock2', '600223'), ('stock3', '600233'), ('stock4', None)])

    # popitem() 按照后进先出原则,删除最后加入的元素,返回key-value

    print(x.popitem(), x) # ('stock4', None) OrderedDict([('stock1', '600213'), ('stock2', '600223'), ('stock3', '600233')])

    # pop() 获取指定key的value,并在字典中删除

    k = x.pop('stock1')

    print(k, x) # 600213 OrderedDict([('stock2', '600223'), ('stock3', '600233')])

    # keys() 获取字典所有的key

    print(x.keys())

    # clear() 清空有序字典

    #x.clear()

    # copy() 拷贝

    new_dic = x.copy()

    print(new_dic)

    # items(返回由“键值对组成元素“的列表)

    print(x.items())

    # fromkeys() 指定一个列表,把列表中的值作为字典的key, 生成一个字典

    dic = OrderedDict()

    name = ['allen', 'belln', 'cllen']

    print(dic.fromkeys(name)) # OrderedDict([('allen', None), ('belln', None), ('cllen', None)])

    print(dic.fromkeys(name, 20)) # OrderedDict([('allen', 20), ('belln', 20), ('cllen', 20)])

    从Python 3.6开始,Python的字典底层机制更改后已经变成为有序字典了。虽然collections.OrderedDict的使用价值降低了,不过collections中的defaultdict仍然很有用,它可以实现一键多值的字典,如下所示:

    y = defaultdict(list) # 一键多值字典使用defaultdict

    y["stock"].append("600213")

    y["stock"].append("600223")

    y["stock"].append("600413")

    y["stock"].append("600513")

    y["stock"].append("600225")

    y["stock"].append("600273")

    print(y) # defaultdict(, {'stock': ['600213', '600223', '600413', '600513', '600225', '600273']})

    接下来再介绍下collections中的Counter。Counter是一个简单的计数器,目的是用来跟踪值出现的次数。Counter以字典的键值对形式存储值出现的次数,如下所示:

    c_dict = Counter('yyydadyyyaadadsaaaxxxx')

    print(c_dict) # Counter({'a': 7, 'y': 6, 'd': 4, 'x': 4, 's': 1})

    当然也可以使用for循环实现跟踪值出现的次数,如下所示,不过使用Counter更加高效。

    data = 'yyydadyyyaadadsaaaxxxx'

    val_cnt = {}

    for i in data:

    i_cnt = val_cnt.get(i,0) # 查找键的值

    val_cnt[i] = i_cnt + 1

    print(val_cnt) # {'y': 6, 'd': 4, 'a': 7, 's': 1, 'x': 4}

    print(val_cnt.get('a')) # 7

    最后我们再介绍一下ChainMap,它可以加速字典的合并。通常我们合并字典的方式如下所示:

    dicta = {i: i + 1 for i in range(1, 100, 2)}

    dictb = {i: i + 2 for i in range(1, 100, 2)}

    dictc = {i: i + 3 for i in range(1, 100, 2)}

    dictd = {i: i + 4 for i in range(1, 100, 2)}

    dic_total = dicta.copy()

    dic_total.update(dictb)

    dic_total.update(dictc)

    dic_total.update(dictd)

    print(dic_total)

    print(dic_total.get(3, 0))

    使用更高效的ChainMap方法,如下所示:

    dic_total = ChainMap(dicta, dictb, dictc, dictd)

    相关文章

      网友评论

        本文标题:Python基础系列讲解——内置库之collections的使用

        本文链接:https://www.haomeiwen.com/subject/sheauctx.html