词典的六个使用技巧
By 青衣极客 Blue Geek In 2019-11-19
词典dict类型是python中常用的内置数据结构,日常开发用起来也非常方便。可能仍然有一些朋友对dict这个数据结构有诸多不满,但是如果你使用过C++的map类型就会明白python的dict实在是太亲民了。不过关于dict有没有一些技巧让它更好用一点呢?本文就来讨论一下几个在词典类型中常用的小技巧,虽没有颠覆性的东西,但是对于提升开发效率和代码美观程度还是很不错的。
1. 从词典中取值
一般而言,我们从词典类型取值是直接使用中括号和key来完成的。这种方式有个小麻烦,那就是在key不存在的时候会报异常。如果在一些对稳定性有较高要求的项目中,就需要对这种代码进行异常捕获。等代码一写出来自己就觉得恶心了,毕竟这个取值的操作实在太多,那么就需要加很多的try…except…,这可并不是件有意思的事情。那么有没有什么办法解决这个问题呢?答案是使用get方法。get方法的第一个参数是键的名字,第二个参数是默认值,这就不需要再捕获异常了。
d = {'key':123}
# 使用异常捕获
try:
print(d['hello'])
except Exception as e:
print('error, 不存在键为 hello 的数据项')
# 使用get方法
print(d.get('hello', 0))
error, 不存在键为 hello 的数据项
0
2. 向词典增加条目
有这样一个需求:向词典中增加数据,如果这个数据项已经存在就在数据项后追加,如果不存在就创建。看到这样描述的需求,那开门见山的实现方法就是使用if…else…,不过这样写的代码实在是太难看,关键是每次遇到这种需求都要这样实现一遍,这实在不是程序员的作风。这时,setdefault方法或许能助你一臂之力。
d = {}
value = 1
# 使用if...else...实现
if 'hello' not in d:
d['hello'] = [value]
else:
d['hello'].append(value)
# 使用setdefault方法实现
d.setdefault('world', []).append(value)
print(d)
{'hello': [1], 'world': [1]}
3. 使用命名参数
创建词典的时候我们常常使用键的名字和值的方式来创建,键的名字是个字符串,因此需要加上引号。入股只是有少数几个元素也不太妨碍,但是如果有一堆的元素需要指定,那输入引号也足够心烦的。这时,我们可以使用dict来创建,就可以用参数名代替键的名字字符串。
print(dict(a=1,b=2))
print({"a":1, "b":2})
{'a': 1, 'b': 2}
{'a': 1, 'b': 2}
4. 获取子集
从一个词典中获取子集元素是一些需要进行匹配任务中的常见需求。在python中要实现这种需求,往往也是一行代码搞定,不过需要结合词典的get方法和表达式推导来实现。
d = dict(a=1, b=2, c=3, d=4, e=5, f=7)
print(dict([(k,d.get(k, 0)) for k in ['a', 'b']]))
{'a': 1, 'b': 2}
5. 键值反转
在统计任务中有时会遇到需要将词典中的键和值进行反转的需求。第一种简单直观的实现方式还是使用表达式推导,实际上会用这种方式就行。不过python中还有一个更简洁的方式,那就是使用zip函数,配合词典的keys()和values()两个函数实现。
d = dict(a=1, b=2, c=3, d=4, e=5, f=7)
print(dict([(v,k) for k, v in d.items()]))
print(dict(zip(d.values(), d.keys())))
{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 7: 'f'}
{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 7: 'f'}
6. 交集与并集
由于词典类型的键具有互异性(也称唯一性),所以常常将词典当作数学中的集合使用。这时就需要对词典进行求交集和并集的运算。python已经提供了set类型,因此如果是单纯地完成数学集合运算,不建议使用dict。但是总会在一些别的需求中需要使用dict,毕竟dict除了key还带有一些值。
a = dict.fromkeys(range(10))
b = dict.fromkeys(range(6, 15))
# 交集
print(dict.fromkeys([x for x in a if x in b]))
# 并集
c = a.copy()
c.update(b)
print(c)
# 在python3下如果key不是字符串会报错的求并集方法
print(dict(a, **b))
{6: None, 7: None, 8: None, 9: None}
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None, 10: None, 11: None, 12: None, 13: None, 14: None}
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-20-7e20d6381c45> in <module>
8 print(c)
9 # 在python3下如果key不是字符串会报错的求并集方法
---> 10 print(dict(a, **b))
TypeError: keywords must be strings
到此,python中关于dict类型数据的一些常用使用技巧讨论完毕。有时候遇到一些编写python程序的朋友,在使用dict数据结构的时候写了很多不必要的代码,即使是工作多年的朋友也可能会这样,越是考虑情况周全写出来的代码越难看。学会了本文所讨论的这几个技巧,至少不让代码太难看。

COMMENT
博客评论区功能由Github Issue提供,提交Issue时请以本文标题为话题。
"BG48-词典的六个使用技巧"