Python:defaultdict应用示例

class collections.defaultdict([default_factory[, ...]])

defaultdict继承与内置类dict,但对于不存在的键处理方式不同。

dict处理缺失的键

在Python访问dict不存在的键会抛出KeyError异常。如计数列表里的颜色

colors = ('yellow', 'red', 'yellow', 'blue','black', 'white', 'blue', 'blue')
counts = {}

for k in colors:
    counts[k] += 1

因为所有的键在字典counts里都不存在,在counts[k]+=1处会抛出KeyError异常。

Traceback (most recent call last):
 File "<stdin>", line 2, in <module>
KeyError: 'yellow'

我们可以使用dict的setdefault方法对不存在的键设置默认值以避免此问题。

colors = ('yellow', 'red', 'yellow', 'blue','black', 'white', 'blue', 'blue')
counts = {}

for k in colors:
    counts.setdefault(k, 0)
    counts[k] += 1

defaultdict处理缺失的键

defaultdict接受default_factory作为参数,defaultdict用它来初始化缺失键的默认值。

default_factory的值:

  • default_factory可以是类型名,使用指定的类型初始化默认值。
  • default_factory也可以是一个无参的lambda回调函数,回调函数的返回值作为缺失键的默认值。

需要注意的是,只有调用defaultdict的内置方法__getitem__()(实际就是使用下标访问字典,如d[k])才会使用default_factory初始化缺失键的默认值。

上面的示例修改如下:

from collections import defaultdict
colors = ('yellow', 'red', 'yellow', 'blue','black', 'white', 'blue', 'blue')
counts = defaultdict(int)

for k in colors:
    counts[k] += 1

应用示例

分组键值对序列

设置default_factory为list:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

计数

设置defaul_facotry为int:

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> sorted(d.items())
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]

集合

设置default_factory为set:

>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
>>> d = defaultdict(set)
>>> for k, v in s:
...     d[k].add(v)
...
>>> sorted(d.items())
[('blue', {2, 4}), ('red', {1, 3})]

版权声明:著作权归作者所有。

相关推荐

React Router 4 表单提交后重定向示例

表单设置fireRedirect为发起从定向的标记,当表单提交后,更新它的值为fireRedirect=true。当fireRedirect为true时,重定向到原来的页面。import React, { Component } from 'react' import { Redirect } from 'react-router' export default class MyForm

Linux stat命令示例(系统管理命令)

说明stat命令用于显示文件或文件系统的状态。包含了文件的详细信息。语法stat [OPTION]... FILE... 常用选项-L(或--dereference):显示符号链接-f(或--file-system):显示文件系统的状态信息,而不是文件的状态信息-t,(或--terse):简洁模式,只显示摘要信息示例显示文件信息$stat /dev/vda1  Fil

Linux tee命令示例

功能从标准输入读取数据并写入到标准输出和文件。如果输出的文件不存在,则新建文件。语法tee [OPTION]... [FILE]... 选项:-a(--append): 追加输入内容到文件后面,不是覆盖。-i(--ignore-interrupts): 忽略中断信号。-help: 在线帮助。--version: 显示版本信息。示例使用管道

Python切片符号(:)用法及示例

Python的切片符号语法s[start:end:step] s:被切片的对象start:切片迭代的起始索引end:切片迭代的终止索引,但end索引不包含在切片内step:切片步长其中,start,end和step都可以被忽略。切片索引示意图简单用法>>> s = [0,1,2,3,4,5,6,7,8,9] >>> s[1

JavaScript ES 2017: 通过示例学习Async/Await

预备知识ES 2017新增了Asynchronous函数。 在JavaScript中,Async函数本质上是一种处理异步代码的比较简洁的方法。 为了理解这些是什么,以及它们是如何工作的,我们首先需要了解Promise。如果你不知道Promise是什么,那么你应该先阅读我发表的关于Promise的这篇文章。 在理解Promise之前,你是不会理解JavaScr

SpringBoot入门示例

创建Maven POM文件在pom.xml添加内容如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht