Python中的defaultdict方法

        字典dict是另一种可变容器模型,且可存储任意类型对象。格式如下:由键(key)-值(value)对组成。

d = {key1 : value1, key2 : value2 }
  • 键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。
  • 键可以是任何不可变(immutable)数据类型(不可变数据类型:数字,字符串、元组)(也就是说key不能为列表和字典类型),值可以取任何数据类型。
  • 字典中每一项的顺序是任意的。

字典get()操作介绍

# dict.get(key, default=None)
# 返回指定键的值,如果值不在字典中返回default值

num_dict = {"one": 500, "two": "800", "three": "300"}

print(num_dict.get("one", "111"))
print(num_dict.get("four", "hhh"))

返回:
500
hhh

 更多操作地址

collections.defaultdict类的介绍

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

        该函数返回一个类似字典的对象。defaultdict是Python内建字典类(dict)的一个子类,它重写了方法_missing_(key),增加了一个可写的实例变量default_factory,实例变量default_factory被missing()方法使用,如果该变量存在,则用以初始化构造器,默认为None。其它的功能和dict一样,但会为一个不存在的键提供默认值,从而避免KeyError异常

1、使用list作第一个参数,可以很容易将键-值对序列转换为列表字典。

from collections import defaultdict
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
d = defaultdict(list)
for str in strs:
    k = "".join(sorted(str))
    d[k].append(str)
print(sorted(list(d.values())))

返回:
[['bat'], ['eat', 'tea', 'ate'], ['tan', 'nat']]

        当字典中没有的键第一次出现时,default_factory自动为其返回一个空列表[],list.append()会将值添加进新列表;再次遇到相同的键时,list.append()将其它值再添加进该列表。

2、dict.setdefault()也可以实现相同的功能。

strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
d={}
for str in strs:
    k = "".join(sorted(str))
    d.setdefault(k,[]).append(str)
a=sorted(list(d.values()))
print('\n',a)

 返回:
[['bat'], ['eat', 'tea', 'ate'], ['tan', 'nat']]

        字符串中的字母第一次出现时,字典中没有该字母,default_factory函数调用int()为其提供一个默认值0,加法操作将计算出每个字母出现的次数。

一般的dict类型会导致KeyError异常:

from collections import defaultdict
s = 'leetcode'
d = {}
for k in s:
    d[k] += 1
print('\n',d)

返回:
KeyError: 'l'

3、defaultdict还可以被用来计数,将default_factory设为int即可。 defaultdict类避免KeyError异常: 

from collections import defaultdict
s = 'leetcode'
d = defaultdict(int)
for k in s:
    d[k] += 1
print(,d)
a=sorted(d.items())
print('\n',a)

返回:
defaultdict(<class 'int'>, {'l': 1, 'e': 3, 't': 1, 'c': 1, 'o': 1, 'd': 1})

 [('c', 1), ('d', 1), ('e', 3), ('l', 1), ('o', 1), ('t', 1)]

4、使用匿名函数(lambda function)可以更快、更灵活的创建常值函数,返回包括0在内的任意常数值。 

def constant_factory(value):
    return lambda: value
d = defaultdict(constant_factory('leetcode'))
print(d)
d.update(name='panghu', action='like')
print('\n',d)
print('\n','%(name)s %(action)s %(object)s' % d)

返回:
defaultdict(<function constant_factory.<locals>.<lambda> at 0x000002ACE85B1620>, {})

 defaultdict(<function constant_factory.<locals>.<lambda> at 0x000002ACE85B1620>, {'name': 'panghu', 'action': 'like'})

 panghu like leetcode

5、default_factory设为set时,可以用defaultdict建立集合字典。

from collections import defaultdict
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
d = defaultdict(set)
for str in strs:
    k = "".join(sorted(str))
    d[k].add(str)
print(sorted(list(d.values())))

返回:
[{'tea', 'ate', 'eat'}, {'tan', 'nat'}, {'bat'}]

仅为学习记录,侵删

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖虎记录学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值