count_dict = {}
all = ['a','b','c','a','b','b']
for i in all:
if i not in count_dict:
count_dict[i] = 0
count_dict[i] += 1
print(count_dict)
==>{'a': 2, 'b': 3, 'c': 1}当dict中没有对应的key时会抛出keyError异常,所以一般做法是先判断dict中是否有该key,若没有先初始化
忘记判断怎么办?defaultdict会解决
count_dict = defaultdict(int)
all = ['a','b','c','a','b','b']
for i in all:
count_dict[i] += 1
print(count_dict)
==>defaultdict(<class 'int'>, {'a': 2, 'b': 3, 'c': 1})defaultdict:
当你访问一个不存在的key时==>dict[key],defaultdict会自动创建键值对,value根据创建defaultdict时传入的类型对象或函数对象决定
类型对象:
dic_1 = defaultdict(int) dic_2 = defaultdict(tuple) dic_3 = defaultdict(list) dic_4 = defaultdict(str) dic_5 = defaultdict(set) print(dic_1['a']) print(dic_2['a']) print(dic_3['a']) print(dic_4['a']) print(dic_5['a']) ==> 0 () [] set()
函数对象:
可以定义嵌套结构,如下dict嵌套dict
def gen_default():
return {
'name':'',
'member_nums':0
}
default_dict = defaultdict(gen_default) #注意不能加(),因为是对象不是方法
print(default_dict['group1'])
==>{'name': '', 'member_nums': 0}
from collections import defaultdict
传统dict类型使用setdefault方法更加高效
defaultdict是dict的扩展子类,它还会在键不存在的时候赋予默认值
# defaultdict需要传递进来一个可调用的对象,list和int都是可调用对象
default_dict = defaultdict(list)
default_dict['bobby']
key不存在时不会抛出异常,会在key不存在时调用传递进来的可调用对象(以上例子为list),给key添加value。值是list的空数组。
如果传递的是int对象,则默认值为0;
如果需要传嵌套dict,定义一个函数return实现
users = ['bobby1','bobby2','bobby3','bobby1','bobby2','bobby2']
for user in users:
default_dict[user] +=1
def gen_default():
return {
"name":"",
"age":""
}
default_dict = defaultdict(gen_default)
default_dict['group_01']
# 会返回生成嵌套dict结构
"group1":{
"name":"",
"nums":0
}
defaultdict是通过__missing__魔术方法实现原理的
dict 设置默认值的方法:
1、可以通过dict.setdefault(key,default_value)
2、通过defaultdict(可调用的对象)
可调用的对象:list、str、int、dict、函数等
from collections import defaultdict
def gen_default():
return {
"name": "",
"nums": 0
}
if __name__ == "__main__":
# 统计出现的次数
user_dict = {} #空字典
users = ["name1", "name2", "name3", "name1", "name2", "name1" ]
print("方法1:")
for user in users:
if user not in user_dict: # 判断是否存在
user_dict[user] = 1
else:
user_dict[user] += 1
print(user_dict)
print("方法2:")
for user in users:
user_dict.setdefault(user, 0)
user_dict[user] += 1
print(user_dict)
print("--------------------------------------")
default_dict1 = defaultdict(list) # defaultdict()函数接受一个可调用的对象,这个对象可以是list,str,int,dict等。
print(default_dict1)
# 统计颜色出现的次数
default_dict2 = defaultdict(int)
colors = ["red", "black", "red", "blue", "yellow", "green", "green"]
for color in colors:
default_dict2[color] += 1
print(default_dict2)
print("----------------------")
default_dict3 = defaultdict(gen_default)
default_dict3["group"]
print(default_dict3)
user_dict = {
"name": "依依",
"age": 24,
"height": 171,
"cupSize": "B罩杯",
"hibbos": {
"eat": ["火锅", "香蕉"],
"sports": ["跑步","游泳"]
}
}
print(user_dict)
实例:
from collections import defaultdict
from datetime import datetime
def func1():
return None
dict_t = {}
default_dict = defaultdict(int)
key_str = "dskjakdljadakd"
for k in key_str:
dict_t.setdefault(k, 0)
dict_t[k] += 1
default_dict[k] += 1
print("dict_t: {dict_t}\ndefault_dict: {default_dict}".format(dict_t=dict_t, default_dict=default_dict))
##defaultdict 调用自定义函数
default_dict_custom_func = defaultdict(func1)
#defaultdict 调用内置函数
default_dict_sys_func = defaultdict(datetime.now)
print("\ndefault_dict_custom_func: {0}\ndefault_dict_sys_func: {1}".format(default_dict_custom_func['func'], default_dict_sys_func['func']))
dict 设置默认值的方法:
1、可以通过dict.setdefault(key,default_value)
2、通过defaultdict(可调用的对象)
可调用的对象:list、str、int、dict、函数等
namedtuple,defaultdict
user_dict = {}
users = ["bobby1", "bobby2", "bobby3", "bobby1", "bobby2", "bobby2"]
#第一种形式
for user in users:
if user not in user_dict:
user_dict[user] = 1
else:
user_dict[user] += 1
#第二种形式
for user in users:
user_dict.setdefault(user, 0) #若user键不存在,设为默认值0
user_dict[user] += 1
from collections import defaultdict
default_dict = defaultdict(list) #在bobby键不存在时,调用传递对象的名称list,生成空数组
default_dict["bobby"]
#第三种形式
default_dict = defaultdict(int) #默认传递0
for user in users:
default_dict[user] += 1
#如果生成嵌套的dict
def gen_default():
return {"name":"", "nums":0}
default_dict = defaultdict(gen_default)
default_dict["group1"] #没有group1时传递gen_default函数
collections模块