阅读469 返回首页    go Python


Python 字典操作进阶

学习了 Python 基本的字典操作后,学习这些进阶操作,让写出的代码更加优雅简洁和 pythonic 。

与字典值有关的计算问题

想对字典的值进行相关计算,例如找出字典里对应值最大(最小)的项。

解决方案一:

假设要从字典 中找出值最小的项,可以这样做:

值得注意的是 获取字典的全部值, 获取字典的全部键,而且两个序列的顺序依然保持一一对应的关系。因此 实质上生成的是一个 的序列。 函数通过比较序列中的元组 找出其最小值。

解决方案二:

除了使用 外,还可以使用 方法和生成器推导式来生成 序列,从而传递给 函数进行比较:

这里 函数的参数 其实是一个生成器推导式(和列表推导式一样,只是把列表推导式的 改为 ,而且其返回的一个生成器而非列表),由于生成器推导式做为 函数的参数,所以可以省略掉两边的括号(不做为参数时写法应该是 )。

字典推导式问题

想把一个元组列表转换成一个字典,例如把 转化为

解决方案

类似于列表推导式,字典推导式可以方便地从其他数据结构构造字典,例如:

字典推导式的规则和列表推导式一样,只是把 换成

寻找字典的交集问题

假设有两个字典:

要找出这两个字典中具有公共键的项,即要得到结果

解决方案

我们知道一般通过 方法来遍历字典, 方法返回的对象是一个类集合对象,支持集合的基本运算,如取交集、并集等。

此外, 返回字典的键,也是一个类集合对象,如果我们只想找出两个字典中键相同的项,可以这样:

这里如果相同的键对应不同的值则去第一个字典中的值。推广开来,如果想排除掉字典中的某些键,可以这样:

但有一点需要注意的是, 返回字典的值,由于字典对应的值不一定唯一,所以 一般无法构成一个集合,因此也就不支持一般的集合操作。

多个字典连接成一个字典问题

有多个字典,例如:

想将这多个字典连接为一个字典,或一次性对多个字典进行迭代操作。

解决方案

使用 :

将传入的多个字典连接为一个字典,并返回一个 对象,这个对象的行为就像一个单一的字典,我们可以对其进行取值或者迭代等操作。注意到这里键 对应的值为 3,如果传入 的字典含有相同的键,则对应的值为先传入的字典中的值。

此外,如果你只想单纯地迭代字典的键值对,可以结合使用 和 方法:

这里相同的键会被分别迭代出来。

保持字典有序问题

想让字典中元素的迭代顺序和其加入字典的顺序保持一致

解决方案

通常来说,使用 或者 、 方法迭代出来的元素顺序是无法预料的。例如对字典 迭代:

每一次运行结果都可能不同。如果想让元素迭代的顺序和创建字典时元素的顺序一致,就要使用 代替普通的 :

实际通过维护一个双向链表来记录元素添加的顺序,因此其耗费的内存大约为普通字典的两倍。所以在实际使用中需综合考虑各种因素来决定是否使用 。

使字典的键映射多个值问题

通常情况下字典的键只对应一个值。现在想让一个键对应多个值。

解决方案

为了使一个键对应多个值,首先需要把多个值放到一个容器中(例如列表或者集合等)。例如有这样一个列表: ,我们要将其转换成一个字典,保持元素的键值对应关系,通常我们会写这样的代码:

但是 语句让代码显得有点冗余和不易读, 的 改善上述代码。

的判语句没有了。

是 的一个子类。对 来说,如果 不存在,则 取值操作会抛出 异常,但是 则会返回一个传入 构造器的类的实例(例如一个列表)或者自定义的缺失值。因此在上例中,对于 ,当 不存在时,则会先执行 并返回这个空列表,继而将 加入到列表中。

传入 构造器的值不一定要是一个类,也可以是一个可调用的函数,当相应的键不在 中时,其默认的值就为这个函数的返回值,例如:

利用这样一个特性,我们可以构造无限深度的字典结构:

这里当执行 时,由于相应的键不存在,故返回一个 ,当再执行 时,将键 对应的值设为 1 。

最后更新:2017-10-08 15:41:57

  上一篇:go Python查看微信好友男女比例
  下一篇:go Python进程、线程、回调与协程 总结笔记 适合新手明确基本概念