使用setdefault方法处理字典缺失值
在处理字典集合的时候经常会去访问字典的键,由于场景有很多种比如有时候访问的字典键并不存在,那么如何很好的处理缺失值呢,这里要提到的就是字典的setdefault()方法,setdefault()方法其实也类似于字典里的get()方法。
get()方法会判断字典的键是否存在,如果存在则返回值否则不做任何返回也不会导致任何异常,当然用get(key, default=None)其实也可以设定默认值,一旦设置了默认值,那么在没有找到键的情况就返回设定的默认值。
而用setdefault()方法直接访问字典键会返回对应键值,但是当键不存在的时候,新的键会在字典中被添加进字典中,并且默认设置为None值,这就是与get()的唯一不同之处。
test = {'name':"anders"}
test.setdefault('name')
# 输出如下:
# 'anders'
test = {'name':"anders"}
test.setdefault('age')
print(test)
# 输出如下:
# {'name': 'anders', 'age': None}
setdefault的方法语法是dict.setdefault(key, default=None),所以自然可以在使用setdefault()方法时设定默认值,如果本身就存在对应的键那就返回原有键的值,否则就会添加我们设置的字典新键和键值。
test = {'name':"anders"}
# 我们试着用setdefault方法访问name键,并附带mary键值。
test.setdefault('name', 'mary')
print(test)
# 输出如下:
# {'name': 'anders'}
因为我们本身在该字典中存在name键所以依然返回原有的键的值内容为anders。
对于所设定的默认值,不仅仅是一种单类型,我们还可以设置一个list列表。
test = {'name':"anders"}
# 我们给默认值设置为[]列表,随后使用列表的append方法添加列表值。
test.setdefault('nickname', []).append('apple')
test.setdefault('nickname', []).append('orange')
print(test)
# 输出如下:
# {'name': 'anders', 'nickname': ['apple', 'orange']}
甚至也可以将默认值设置为dict字典类型。
test = {'name':"anders"}
# 我们给默认值设置为{}字典,随后使用比较特殊的方式[] = ""的方式定义。
test.setdefault('nickname', {})["name1"] = "apple"
test.setdefault('nickname', {})["name2"] = "orange"
print(test)
# 输出如下:
# {'name': 'anders', 'nickname': {'name1': 'apple', 'name2': 'orange'}}
在将默认值设定为字典类型的时候写法有些稍许注意的是定义方式以类似["name1"] = "apple"这样的方式添加新值。
在平时编码环境中set default()方法的作用还是非常有用的,比如下面这个例子是用来遍历当前存在的字典列表,如果不存在就添加进去,顺便把键值按照顺序数值来分配。遇到这种情况时就可以考虑使用setdefault()方法了。
dict_strings = {'puppy': 1, 'kitten': 2, 'doggy':3, 'weasel':4}
strings = ('puppy', 'kitten', 'doggy', 'weasel',
'anderson', 'jason')
count = 1
for kw in strings:
# setdefault的默认值设置为循环的次数,当提取的字典键不存在的时候把当前的count值设置为默认值。
dict_strings.setdefault(kw, count)
# count变量用于计算当前循环键的次数
count = count + 1
print(dict_strings)
# 输出如下:
# {'puppy': 1, 'kitten': 2, 'doggy': 3, 'weasel': 4, 'anderson': 5, 'jason': 6}