01
引言
Python是我最喜欢的编程语言之一,它向来以其简单性、多功能性和可读性而闻名。
字典作为Python中最常使用的数据类型,大家几乎每个人都或多或少在项目中使用过字典,但是字典里有一些潜在的技巧可能并不是每个同学都会用到。
在本文中,我们将深入探讨七个关于字典的使用技巧,希望可以帮助到大家!
02
初始化技巧
如果让大家创建一个字典,大家可能80%都会直接选择{}来进行创建,代码示例如下:
# normal way of creating a dictionary`` ``d = {'apple':4, 'orange':5, 'pear':6, 'pineapple':7}
这里推荐大家直接使用 dict(key=value)的方式来创建字典,代码如下:
# 'better' way to creating same dictionary`` ``d = dict(apple=4, orange=5, pear=6, pineapple=7)
虽然两者实现了相同的功能,但是为什么第二种方式更好呢?
-
使用 {} 创建字典时,我们需要在字符串的键上加上引号来说明我们key的数据类型为字符串;由于我们有很多元素,所以我们就需要不断输入新的引号;而我们第二种方式下,则不需要输入引号。
-
dict方法不适用于非字符串的键,因此这两种方式都有其具体使用的场合。
03
字典合并
这里推荐大家使用解包符号******来进行两个字典的合并,代码如下:
# here are 2 dicts``a = {1:1, 2:2}``b = {3:3, 4:4}`` ``# we can combine them using **``x = {**a, **b}``print(x) # {1:1, 2:2, 3:3, 4:4}
上述代码中的 ** 会将键值对解包到父字典中,我们也可以在组建新字典的时候添加新的键值对,代码如下:
# we can add normal key-value pairs too``a = {1:1, 2:2}``b = {3:3, 4:4}`` ``x = {**a, **b, 5:5}``print(x) # {1:1, 2:2, 3:3, 4:4, 5:5}
04
字典作为函数参数传递
我们可以使用**将字典作为函数关键字参数进行传递,我们来举个简单的例子,一般的函数调用如下:
# a function that takes in a, b, c`` ``def test(a, b, c):` `print(a, b, c)`` ``test(a=1, c=2, b=3) # 1 3 2
我们也可以将包含key为 a、b 和 c 的字典动态地传入该函数,如下:
mydict = dict(a=1, b=2, c=3)``print(mydict) # {'a':1, 'b':2, 'c':3}`` ``# this is the same as test(a=1, b=2, c=3)``test(**mydict) # 1 2 3
上述代码中,我们使用 ** 进行字典解包,并将解包后相应的参数传递给对应的函数。
05
字典生成式
假设我们要创建以下字典 {1:1, 2:4, 3:9, 4:16},代码如下:
# normal way to create this`` ``d = {}``for i in range(1, 5):` `d[i] = i**2`` ``print(d) # {1: 1, 2: 4, 3: 9, 4: 16}
使用字典生成式的代码如下:
# dict comprehension way to create this`` ``d = {i:i**2 for i in range(1, 5)}`` ``print(d) # {1:1, 2:4, 3:9, 4:16}
这两种方法都是正确和合法的。但要注意的是,字典生成式理解起来要优雅得多、读起来也容易得多。
我们再来看个嵌套字典的例子,一般写法如下:
# nested for loops`` ``d = {}``for i in range(2):` `for j in range(2, 4):` `d[(i,j)] = 0`` ``print(d)`` ``# {(0, 2): 0, (0, 3): 0, (1, 2): 0, (1, 3): 0}
更优雅的写法如下:
# nested for loops in dict comprehension`` ``d = {(i,j):0 for i in range(2) for j in range(2, 4)}`` ``print(d)`` ``# {(0, 2): 0, (0, 3): 0, (1, 2): 0, (1, 3): 0}
06
获取默认值
当我们访问一个不存在的键时,我们会得到 KeyError,如下:
d = {1:1, 2:2, 3:3}`` ``print(d[1]) # 1``print(d[4]) # KeyError
如果我们真的不希望出现 KeyError,则推荐使用字典中的get() 方法,如果键不存在,则返回 None。
# using .get()`` ``d = {1:1, 2:2, 3:3}`` ``print(d.get(1)) # 1``print(d.get(4)) # None
注意到上述代码中,我们得到的不是KeyError,而是None。
更进一步,我们也可以指定返回的默认值,代码如下:
# .get() but with custom default value`` ``d = {1:1, 2:2, 3:3}`` ``print(d.get(1, 100)) # 1``print(d.get(4, 100)) # 100``print(d.get(9, 100)) # 100
07
使用元组列表来创建字典
假设我们有以下元组构成的列表,示例如下:
# a list of tuples (of length 2)`` ``ls = [('apple', 4), ('orange', 5), ('pear', 6)]
则可使用以下技巧生成字典,代码如下:
# we can pass this into dict() to create a dict`` ``d = dict(ls)``print(d) # {'apple': 4, 'orange': 5, 'pear': 6}
这对快速从元组创建字典非常有用,无需编写字典生成式。
08
遍历字典
假设我们有以下字典,如下:
# a dict``d = dict(apple=4, orange=5, pear=6)`` ``print(d) # {'apple':4, 'orange':5, 'pear':6}
当我们遍历 dict 本身时,我们则会生成所有 dict的键:
for k in d:` `print(k)`` ``# apple``# orange``# pear
同时,我们也可以使用函数values()来访问字典dict中所有的值,如下:
for v in d.values():` `print(v)`` ``# 4``# 5``# 6
此外,如果我们使用函数items(),则键和值都会生成一个元组,如下:
for k,v in d.items():` `print(k, v)`` ``# apple 4``# orange 5``# pear 6
我自己认为函数items() 是最有用的方法,可以快速遍历字典中的所有键值对。
09
总结
本文介绍了Python中字典的七种有趣小技巧,使用这些技巧,可以快速提升大家的编码能力。
您学废了吗?