美文网首页
2018-11-01 032 字典进阶 B

2018-11-01 032 字典进阶 B

作者: 杜若飞er | 来源:发表于2018-11-01 19:59 被阅读2次

    今天继续说字典。

    变种字典

    在collections模块中,除了defaultdict之外,还有很多种不同的映射类型,我们大致来介绍一下:

    collections.OrderedDict

    从字面意思山大家大概就知道这是个什么东西——“有序字典”,这种数据类型在添加数据的时候是有顺序的,按照Key的排序把元素安排得整整齐齐明明白白,因此在有序字典中,键的迭代次序总是一致的。

    collections.ChainMap

    该类型可以容纳若干个不同的映射对象,在进行键查找操作的时候,这些对象就会被当作一个整体进行逐个查找,知道找到为止,这个功能主要用于在有嵌套作用域的语言做解释器,本菜鸡今天用起来感觉一点也不顺手,毕竟,作为一个渣渣大学生,貌似还用不到给别的语言写解释器这种知识……

    collections.Counter

    计数器字典,这种数据类型会给键准备一个整数计数器,每次更新或者增添元素的时候都会把这个记录修正一下,这样我们就可以用它来给可散列的列表对象计数,下面我们来看一个小例子:

    import collections
    ct = collections.Counter("abcdabcd")
    print(ct)
    ct.update('aaaaaaaaaaa')
    print(ct)
    

    输出是这样的:

    Counter({'a': 2, 'b': 2, 'c': 2, 'd': 2})
    Counter({'a': 13, 'b': 2, 'c': 2, 'd': 2})
    

    这里其实和我们传统意义上的字典已经不太一样,甚至来说,我们更愿意把它看作一个改造过的列表,在每一个元素后面都标记一下这个元素在序列中出现的次数,但是在底层,这个数据结构的实现还是更类似于字典的实现方法。
    例子中貌似是使用了匈牙利命名法。【注释1】

    collections.UserDict

    同样看名字,这是一个写给用户的字典——通俗来说,就是用完全Python的方法重写了标准的dict,用来给用户提供写子类的方法,这一点其实非常重要,让字典拥有了强大的可拓展性,我们可以根据自己不同的需求,自己定制一个Dict出来,只要你水平足够高,甚至自己写个库也没什么不可能。
    本来应该抛出一个小例子,但是忽然发现本菜鸡写了一通,类和对象竟然还没写,甚至连最基本的一些东西都没提及,因为本菜鸡也知道这个系列写了一个多月,阅读量最大的一篇用两只手也能数过来,应该都是编程的初学者偶尔看看,对象和类,想抽个时间好好写一下,因为这有可能是编程中最重要的两个思想之一,所以,先就不写drfDict了,免得给读者造成困扰。


    【注释1】:匈牙利命名法:匈牙利命名法是微软的天才工程师西蒙尼首创并且推广的一种命名法则,因为西蒙尼是美籍匈牙利裔,所以就被称为匈牙利命名法。这套命名法的原则就是变量名在命名的时候就明确地提示出一些重要信息,比如说需要一个计数器变量时就用取一个小写字母c开头的名字(count)诸如此类,在类型严格但是解释器又不太能类型检查的语言里(比如C语言),这样的命名法可以让程序员一目了然地知道这个变量的大致作用,就可以减少比如说把一个人的身高值赋给他的体重这个变量这种低级错误,要知道在C语言中这并不会产生即时的错误,因为C语言的解释器只知道这是两个整形数字,相互赋值并没有问题,但程序运行时间长一点就会发现这样的逻辑错误必然是会造成麻烦的。
    西蒙尼算是全世界最伟大程序员排得上的神级人物,万恶的MS-Office三大金刚有两个是他负责搞出来,另一个则是他提议收购的,不过在自己的文章里,西蒙尼在描述这种命名法则的时候使用了"type"这个单词,让很多程序员错误地以为他的命名法是把变量数据类型写在变量名,里,其实匈牙利命名法本意并非如此(从我们举的例子也看得出,没见过哪种类型叫Count的),这就给命名法的衰败留下了祸根。
    匈牙利命名法曾经是微软力推的命名法则,但是因为大部分程序员更喜欢简单粗暴的办法,匈牙利命名法逐渐还是式微了,到现在微软本身也不再提倡。
    我看好多教科书变量都一律用ijkabcd命名了——
    你们开心就好。

    相关文章

      网友评论

          本文标题:2018-11-01 032 字典进阶 B

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