setdefault

dict.setdefault(key, default=None)

如果键不存在于字典中,将会添加新的键并将值设为默认值(改变了字典)。如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。

stu = [('wang', 1), ('zhang', 4), ('fu', 2), ('li', 3), ('fu', 7), ('wang', 2), ('wang', 8)]

stu_set = {}

for k, v in stu:

stu_set.setdefault(k, set()).add(v)

for k, v in stu_set.items():

print(k, v)

# output

zhang {4}

fu {2, 7}

li {3}

wang {8, 1, 2}

get

get()方法返回给定键的值。如果键不可用,则返回默认值(没有改变字典)。

dict.get(key, default=None)

collections defaultdict

defaultdict() 返回一个字典,会自动给每个键(key)赋一个初始值

collections.default([default_factory[, ...]])

使用工厂方法default_factory给所有key对应的value赋初始值,这些工厂方法有int(), long(), float(), complex(),str(), unicode(), basestring(),

list(), tuple(),dict(),bool()

set(), frozenset(),object(), classmethod()

staticmethod(),super(),property(),file()

import collections

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

d = collections.defaultdict(list)

for k, v in s:

d[k].append(v)

list(d.items())

如果不用工厂方法,也可以使用自定义方法

counts = collections.defaultdict(lambda : [0, 0, 0])

例如,可以让每个vlaue的初始值为10

import collections

d = collections.defaultdict(lambda :10)

a = [('a', 1), ('b', 3), ('c', 2), ('b', 6), ('a', 7)]

for k, v in a:

d[k] += v

for k, v in d.items():

print(k, v)

# output

c 12

b 19

a 18

在Python里面有一个模块collections,解释是数据类型容器模块。这里面有一个collections.defaultdict()经常被用到。主要说说这个东西。

综述:

这里的defaultdict(function_factory)构建的是一个类似dictionary的对象,其中keys的值,自行确定赋值,但是values的类型,是function_factory的类实例,而且具有默认值。比如default(int)则创建一个类似dictionary对象,里面任何的values都是int的实例,而且就算是一个不存在的key, d[key] 也有一个默认值,这个默认值是int()的默认值0.

defaultdict

dict subclass that calls a factory function to supply missing values。

这是一个简短的解释

defaultdict属于内建函数dict的一个子类,调用工厂函数提供缺失的值。

比较晕,什么是工厂函数:

来自python 核心编程的解释

Python 2.2 统一了类型和类, 所有的内建类型现在也都是类, 在这基础之上, 原来的

所谓内建转换函数象int(), type(), list() 等等, 现在都成了工厂函数。 也就是说虽然他

们看上去有点象函数, 实质上他们是类。当你调用它们时, 实际上是生成了该类型的一个实

例, 就象工厂生产货物一样。

下面这些大家熟悉的工厂函数在老的Python 版里被称为内建函数:

int(), long(), float(), complex()

str(), unicode(), basestring()

list(), tuple()

type()

以前没有工厂函数的其他类型,现在也都有了工厂函数。除此之外,那些支持新风格的类

的全新的数据类型,也添加了相应的工厂函数。下面列出了这些工厂函数:

dict()

bool()

set(), frozenset()

object()

classmethod()

staticmethod()

super()

property()

file()

再看看它的使用:

import collections

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

d = collections.defaultdict(list)

for k, v in s:

d[k].append(v)

list(d.items())

这里就开始有点明白了,原来defaultdict可以接受一个内建函数list作为参数。其实呢,list()本身是内建函数,但是再经过更新后,python里面所有东西都是对象,所以list改编成了类,引入list的时候产生一个类的实例。

还是不太明白,再看defaultdict的help解释

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

Returns a new dictionary-like object. defaultdict is a subclass of the built-in dict class. It overrides one method and adds one writable instance variable. The remaining functionality is the same as for the dict class and is not documented here.

首先说了,collections.defaultdict会返回一个类似dictionary的对象,注意是类似的对象,不是完全一样的对象。这个defaultdict和dict类,几乎是一样的,除了它重载了一个方法和增加了一个可写的实例变量。(可写的实例变量,我还是没明白)

The first argument provides the initial value for the default_factory attribute; it defaults to None. All remaining arguments are treated the same as if they were passed to the dict constructor, including keyword arguments.

defaultdict objects support the following method in addition to the standard dict operations:

__missing__(key)

If the default_factory attribute is None, this raises a KeyError exception with the key as argument.

If default_factory is not None, it is called without arguments to provide a default value for the given key, this value is inserted in the dictionary for the key, and returned.

主要关注这个话,如果default_factory不是None, 这个default_factory将以一个无参数的形式被调用,提供一个默认值给___missing__方法的key。 这个默认值将作为key插入到数据字典里,然后返回。

十分晕。有扯出了个__missing__方法,这个__missing__方法是collections.defaultdict()的内建方法。

If calling default_factory raises an exception this exception is propagated unchanged.

This method is called by the __getitem__() method of the dict class when the requested key is not found; whatever it returns or raises is then returned or raised by __getitem__().

Note that __missing__() is not called for any operations besides __getitem__(). This means that get() will, like normal dictionaries, return None as a default rather than using default_factory.

defaultdict objects support the following instance variable:

default_factory

This attribute is used by the __missing__() method; it is initialized from the first argument to the constructor, if present, or to None, if absent.

看样子这个文档是难以看懂了。直接看示例:

import collections

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

# defaultdict

d = collections.defaultdict(list)

for k, v in s:

d[k].append(v)

# Use dict and setdefault

g = {}

for k, v in s:

g.setdefault(k, []).append(v)

# Use dict

e = {}

for k, v in s:

e[k] = v

##list(d.items())

##list(g.items())

##list(e.items())

看看结果

list(d.items())

[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

>>> list(g.items())

[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

>>> list(e.items())

[('blue', 4), ('red', 1), ('yellow', 3)]

>>> d

defaultdict(, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})

>>> g

{'blue': [2, 4], 'red': [1], 'yellow': [1, 3]}

>>> e

{'blue': 4, 'red': 1, 'yellow': 3}

>>> d.items()

dict_items([('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])])

>>> d["blue"]

[2, 4]

>>> d.keys()

dict_keys(['blue', 'red', 'yellow'])

>>> d.default_factory

>>> d.values()

dict_values([[2, 4], [1], [1, 3]])

可以看出

collections.defaultdict(list)使用起来效果和运用dict.setdefault()比较相似

python help上也这么说了

When each key is encountered for the first time, it is not already in the mapping; so an entry is automatically created using the default_factory function which returns an empty list. The list.append() operation then attaches the value to the new list. When keys are encountered again, the look-up proceeds normally (returning the list for that key) and the list.append() operation adds another value to the list. This technique is simpler and faster than an equivalent technique using dict.setdefault():

说这种方法会和dict.setdefault()等价,但是要更快。

有必要看看dict.setdefault()

setdefault(key[, default])

If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

如果这个key已经在dictionary里面存着,返回value.如果key不存在,插入key和一个default value,返回Default. 默认的defaults是None.

但是这里要注意的是defaultdict是和dict.setdefault等价,和下面那个直接赋值是有区别的。从结果里面就可以看到,直接赋值会覆盖。

从最后的d.values还有d[“blue”]来看,后面的使用其实是和dict的用法一样的,唯一不同的就是初始化的问题。defaultdict可以利用工厂函数,给初始keyi带来一个默认值。

这个默认值也许是空的list[] defaultdict(list), 也许是0, defaultdict(int).

再看看下面的这个例子。

defaultdict(int) 这里的d其实是生成了一个默认为0的带key的数据字典。你可以想象成 d[key] = int default (int工厂函数的默认值为0)

d[k]所以可以直接读取 d[“m”] += 1 就是d[“m”] 就是默认值 0+1 = 1

后面的道理就一样了。

>>> s = 'mississippi'

>>> d = defaultdict(int)

>>> for k in s:

... d[k] += 1

...

>>> list(d.items())

[('i', 4), ('p', 2), ('s', 4), ('m', 1)]

python字典初始化_python设置默认字典相关推荐

  1. python 设置默认字典

    访问字典中某个'键'时,若键不存在则会报错,比如 >>> dic = {'a' : 1} >>> dic['b'] Traceback (most recent c ...

  2. python设置默认字典(setdefault collections.defaultdict)

    setdefault get collections defaultdict setdefault dict.setdefault(key, default=None) 如果键不存在于字典中,将会添加 ...

  3. python 字典处理_Python 6 个字典操作你必须知道

    原标题:Python 6 个字典操作你必须知道 key是否存在 使用in关键字判断key是否存在字典中 不要使用key in d.keys(), 这是一种画蛇添足的操作,因为d.keys()会返回一个 ...

  4. python字典编码_Python列表,字典,元组,字符串操作,文件操作,字符编码

    1. 列表操作 1.1 列表的定义: names = ["wangjing", "wangjun", "hashiqi"] names[0] ...

  5. python集合运算符_Python 集合、字典、运算符

    先区分一下序列类型和散列类型: 序列类型:list.string.tuple,他们中的元素是有序的. 散列类型:set.dict,他们中的元素无序的.(注意:python3.7.0开始字典变成&quo ...

  6. python设置默认utf8编码_Python设置默认编码为utf8的方法

    本文实例讲述了python设置默认编码为utf8的方法.分享给大家供大家参考,具体如下: 这是Python的编码问题,设置python的默认编码为utf8 python安装目录:/etc/python ...

  7. python编写字典库_Python中的字典及举例-阿里云开发者社区

    字典 字典是python中的唯一的映射类型(哈希表) 字典对象是可变的,但是字典的键必须使用不可变对象,一个字典中可以使用不同类型的键值. 字典的方法 keys() values() items() ...

  8. python获取字典长度_Python中的字典

    1 字典的定义 dictionary(字典) 是 除列表以外Python之中 最灵活的数据类型 字典同样可以用来 存储多个数据 通常用于存储 描述一个 物体的相关信息 和列表的区别 列表是 有序的对象 ...

  9. python字典更新_python如何更新字典?

    python中可以使用update()函数更新字典. update()方法语法:dict.update(dict2)D.update(key/value) 参数 dict2 -- 添加到指定字典dic ...

最新文章

  1. Java黑皮书课后题第5章:*5.39(金融应用:求销售总额)假设你正在某百货商店开始销售工作。你的工资包括基本工资和提成。基本工资是5000美元。你的目标是一年挣30000美元,编写程序找最小销售额
  2. LiveVideoStackCon 2022 上海站 专题抢先看
  3. SpringBoot学习(二)探究Springboot启动机制
  4. 产品经理,你来自江湖
  5. 搭建一个互联网公司后台服务架构及运维架构需要的技术
  6. 如何不用BPM配置时间
  7. 不同坐标系下角速度_CNC | 数控机床坐标系探究
  8. 【架构】浅谈web网站架构演变过程
  9. 斯坦福大学深度学习公开课cs231n学习笔记(4)正向传播及反向传播
  10. java8计算两个日期之间的天数
  11. kodi android 目录,Kodi使用豆瓣刮削器建立媒体库,以及把资料库导出到片源目录...
  12. java毕业设计水果网店管理系统mybatis+源码+调试部署+系统+数据库+lw
  13. 威漫哨兵机器人_曾经秒杀X战警的哨兵机器人,在漫威漫画原著里更让人头疼!...
  14. HDU-5064-Find Sequence(DP)
  15. ⅴs2010控件名称及用方法_VS2010 用户自定义工具箱控件的制作方法
  16. xxl-job源码解读:调度器schedule
  17. 逻辑对计算机,对计算机模拟中的逻辑、方法论的几点认识
  18. 【Go基础】1 - Go Go Go
  19. Freeswitch 默认配置
  20. unity摄像机追踪屏幕抖动的问题

热门文章

  1. VS2013 产品密钥 – 所有版本
  2. Hive分区(静态分区+动态分区)
  3. DSA——直接插入排序笔记
  4. git克隆某一个branch
  5. Mybatis 的日志管理
  6. yii2 关系...
  7. 手动配置泛域名https (资源)
  8. 定期删除30天以前的elasticsearch的日志
  9. Kibana 6.2.3修改本地时区
  10. 力扣题目——98. 验证二叉搜索树