Python 3数据类型之字典与集合

本文介绍了Python 3中字典dict和集合set的基本概念、接口定义、实现与操作方法。dict实现了MutableMapping接口,set实现了MutableSet接口,它们都支持Container和Iterable接口,但dict支持Mapping接口,set支持Set接口。文章详细讲解了两者在映射、集合运算、使用方法上的异同,包括下标索引、迭代、哈希及集合操作如交集、并集、差集和对称差集等。同时,讨论了len()方法与bool值在dict和set中的应用。
摘要由CSDN通过智能技术生成

Python 3中的内置collections类型包括序列,字典dict和集合set/frozenset。序列在https://editor.csdn.net/md/?articleId=112730263一文中已经详细解析,这里总结字典dict和集合set/frozenset。

映射和集合的接口定义与实现

字典dict和集合set/frozenset实际上是builtins模块中的具体实现类型,它们的接口类定义都位于collections.abc模块中。dict类型实现了接口类collections.abc.MutableMapping定义的方法,它其实是一个映射类型;set类型则实现了接口类collections.abc.MutableSet定义的方法;frozenset类型则实现了接口类collections.abc.Set定义的方法。从接口类名称不难判断,dict和set都是可变类型,因此它们都不支持hash()方法;frozenset则是不可变类型,支持hash()方法。相关接口类层次如下所示。

    builtins.object
        Container
        Hashable
        Iterable
            Iterator
                Generator
            Reversible
                Sequence(Reversible, Collection)
                    ByteString
                    MutableSequence
        Sized
            Collection(Sized, Iterable, Container)
                Mapping
                    MutableMapping
                Set
                    MutableSet

从上面的接口类层次可以看出,序列、字典、集合它们都有共同的接口基类collections.abc.Collection,因此它们都支持Collection定义的方法。但是序列类型支持的接口类collections.abc.Sequence,dict和set并不支持;dict支持的接口类collections.abc.Mapping,序列类型和set并不支持;set支持的接口类collections.abc.Set,序列类型和dict并不支持,这是操作这些类型的区别的根本所在。主要的接口方法总结如下。

  • Container: 主要方法__contains__(), 用于判断容器是否含有某个元素。需要注意的是对于dict,这个操作针对的是关键字。
  • Iterable: 主要方法__iter__(), 用于返回一个迭代器。调用iter()函数时,其实也就是调用对象的__iter__()方法。需要注意的是,对于dict,遍历的是关键字。
  • Reversible: 主要方法__reversed__(),用于返回一个逆向迭代器。调用reverse()函数时,其实也就是调用对象的__reversed__()方法。从下面的测试代码可知,集合类set由于是无序的,因此并不支持逆向遍历。而对于dict,迭代的同样是关键字。
  • Sized: 主要方法__len__(),用于返回序列长度(元素个数)。调用len()函数时,其实就是调用对象的__len__()方法。
  • Iterator: 迭代器的基类,除了从Iterable继承的__iter__()方法,还定义了__next__()方法。迭代器遍历正是通过这两个方法实现的。
  • Mapping: 主要接口方法__getitem__(),这是dict类支持下标索引的基础。但dict类在实现该方法时,传入的参数是关键字,因此dict类的下标索引也是关键字。Set类并未定义该方法,因此集合set并不支持下标索引。
  • Set: 主要方法定义了集合运算,包括__and__(), __or__(), __sub__(), __xor__()。因此对于set类型的对象,可以使用’&,|, ^, -'等运算,其含义分别对应于数学集合中的交集、并集、对称差集以及差集。

序列,字典与集合的接口方法的主要差别再总结如下。

  • 序列和dict都支持下标索引方式,但dict的下标为关键字。set不支持下标索引方式。本质原因在于是否支持接口方法__getitem__。
  • 序列和dict都支持正方向迭代器iter()和reversed(),set只支持iter(),不支持reversed()。本质原因在于是否实现Reversible接口的__reversed__()方法。
  • list, dict, set都不支持hash(),其它序列和frozenset支持hash()。本质原因在于是否实现Hashable接口的__hash__()方法。
  • set/frozenset类支持’&, |, ^, -‘运算,序列和dict并不支持;序列支持拼接运算’+, *’, dict和set并不支持。
import collections
print(issubclass(dict,collections.abc.MutableMapping))
print(issubclass(dict,collections.abc.Hashable))
print(issubclass(dict,collections.abc.Reversible))
print(issubclass(set,collections.abc.MutableSet))
print(issubclass(set,collections.abc.Hashable))
print(issubclass(set,collections.abc.Reversible))
print(issubclass(frozenset,collections.abc.Set))
print(issubclass(frozenset,collections.abc.Hashable))
print(issubclass(frozenset,collections.abc.Reversible))
True
False
True
True
False
False
True
True
False

具体的实现类dict和set又提供了一些额外的操作方法,这些操作方法可能只有这种实现才提供。在之前序列的解析中,也可以看到类似的设计,即接口类定义了一些方法,实现类除了实现接口规定的方法,还提供一些自己的操作方法。由此可以看出,Python明确地把接口方法和实现相关方法分开了。这样,如果用户要自己实现collection类,最低要求就是实现接口类定义的方法。关于dict类和set类的操作方法,可通过命令help(dict)和help(set)分别查看。

字典和集合的使用

set和frozenset除了可变与不可变之外,操作上并无太大区别。因此下面主要以set为例。dict和set都采用{}来表示,但是dict是key:value的形式。

# set
print(type({
   1,2,3}))
s={
   'hello'}
print(type(s),s)
s={
   *'hello'}
print(type(s),s)
#dict
print(type({
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值