当前位置: 首页 > 科技观察

Python编程:详解内置字典(dict)子类及应用(一气呵成)

时间:2023-03-16 00:14:23 科技观察

前言主要介绍了Python中字典类(dict)的几个内置扩展子类的应用场景和使用示例collection模块,或者结合代码,让你“短小精悍”地掌握这些与dict直接相关的子类——OrderedDict、defaultdict、userDict。OrderedDictPython集合模块中的一个有序字典(OrderedDict)就像一个普通的字典,但是有一些与排序操作相关的额外功能。OrderedDict记住插入键的顺序。现在它们不那么重要了,因为内置的dict类获得了记住插入顺序的能力(这种新行为在Python3.7中得到保证,所以OrderedDict现在似乎不那么重要了)。创建有序字典的一般格式:importcollectionsordDict=collections.OrderedDict([items]):或者fromcollectionsimportOrderedDictordDict=OrderedDict([items]):这创建并返回一个字典子类OrderedDict对象的实例,它有一个专门用于重新排列字典顺序的方法。本文简要介绍这些方法。1)popitem(last=True):有序字典的popitem()方法返回和删除一个(key,value)对。如果last为True,则按照LIFO(后进先出)返回对应的键值对;否则,它以FIFO(先进先出)顺序返回。2)move_to_end(key,last=True):将现有键移动到有序字典的任一端。如果last为True(默认值),则将项目移到右侧,如果last为False,则移到开头。如果键不存在则引发KeyError。请看代码:假设我们删除并重新插入相同的键到OrderedDict中。它将把这个键放在最后,以保持键的插入顺序。示例如下:运行结果如下:删除前的OrderedDict:xXyYzZ插入后的OrderedDict:yYzZxXUserDictUserDict类作为Python内置字典(dict)对象的包装器。对此类的需求已部分被直接从dict子类化的能力所取代;然而,这个类更容易使用,因为底层字典可以作为属性访问。当您想创建自己的具有某些修改或新功能的词典时,请使用UserDict。它的使用格式如下:importcollectionsuserDict=collections.UserDict([initialdata])或importcollectionsuserDict=collections.UserDict([initialdata])这样的模拟字典,其实例的内容存储在一个正则字典中,可以通过通过UserDict实例属性的数据来??访问字典。如果提供了initialdata,则数据内容以此初始化;请注意,实例本身不保留对initialdata的单独(非独占)引用,允许将其用于其他目的。除了支持映射的方法和操作外,UserDict实例还提供了以下属性:1)data一个真正的字典,用于存储UserDict类的内容。示例如下:输出如下:{'name':'KevinCui','age':24}假设我们要定义一个自定义的字典对象,支持加法操作(合并两个字典)。当我们添加自定义词典的两个实例时,我们希望得到一个包含两个词典中所有元素的新词典。请记住,如果您尝试在Python中添加到常规字典,您将得到一个TypeError。我们借助UserDict来实现一下:运行输出如下:{'x':10,'y':20}当然你也可以自己实现其他相关的自定义操作。DefaultDictPython中Dictionary类的一个常见问题是缺少键。当尝试访问字典中不存在的键时,您将得到KeyError异常。所以每当你需要访问字典中的一个元素时,你都必须处理这种情况。幸运的是,Python提供了DefaultDict类。它用于为不存在的键提供一些默认值而不引发KeyError。DefaultDict是内置字典类的子类。它覆盖了一个方法并添加了一个可写的实例变量。其余功能与dict相同。使用格式如下:importcollectionsdefaultDict=collections.defaultdict(default_factory=None,/[,...])上面的代码返回一个新的类字典对象DefaultDict,它是内置dict类的子类。第一个参数为default_factory属性提供初始值,默认为None。所有剩余的参数都被视为传递给dict构造函数,包括关键字参数。需要理解的是,如果提供了这个参数,那么它必须是可调用的。DefaultDict对象除了支持标准的dict操作外,还支持以下方法属性:1)__missing__(key):如果default_factory属性为None,使用key作为参数会引发KeyError异常。如果default_factory不是None,则不带参数调用它会为给定的键提供一个默认值,该值将插入到键的字典中并返回。2)default_factoryDe??faultDict对象支持default_factory实例变量。该属性由__missing__()方法使用。如果存在,则从构造函数的第一个参数初始化;如果不是,则将其初始化为None。运行程序的输出是:[('blue',[2,4]),('red',[1]),('yellow',[1,3])]在上面的代码中,我们使用列表类型作为default_factory,更容易组成包含键值序列对的列表字典。当第一次遇到每个键时,它还不在映射中,因此使用default_factory函数自动创建一个条目,该函数返回一个空列表。然后list.append()操作将值连接到新列表。当再次遇到该键时,查找将正常进行(返回该键的列表),然后list.append()操作将另一个值添加到列表中。该技术比使用dict.setdefault()的等效技术简单得多。再看一个例子:输出如下:[('a',2),('c',1),('g',2),('h',1),('i',1),('j',1),('n',2)]在上面的代码中,我们将default_factory设置为int。这使得defaultdict用于计数(如其他语言中的bag或multiset)。当第一次遇到一个字母时,它不在映射中,因此default_factory函数调用int()以提供默认计数0。增量操作然后为每个字母构建一个计数。提示:此处传递的int()函数默认返回整数0。如果你想返回任何值,你可以自定义一个基于lambda的常量函数。示例代码如下:一句话:使用DefaultDict的好处是可以避免KeyError异常,进行一些可能的特定处理。本文小结本文主要介绍Python字典(dict)类相关的几个内置子类的应用。这些直接相关的子类是OrderedDict、defaultdict、userDict等内置子类。通过示例代码和相关说明,您可以更容易地掌握它们的应用和基本规则。