今天笔者将向大家分享9个令人相见恨晚的Python字典技巧,让你更优雅高效地处理字典,写出更加Pythonic的代码。
1. 使用 dict(key=value) 创建字典
通常,我们通过以下方式创建字典:
test_dict: dict = {'name': 'Jack Zhang', 'age': 23, 'city': 'San Francisco'}
但是我常用的是 dict(key=value) 的方式:
test_dict2: dict = dict(name='Jack Zhang', age=23, city='San Francisco')
这样做的好处是:当使用 {} 创建字典时,对于字符串键,我们需要输入引号符。如果处理的键很多,那么就需要输入更多的引号符,这不仅效率低下,而且还很无聊。而使用 dict(key=value) 方式,则不需要输入引号符,省去了我们很多无聊的工作,并且代码更简洁。
当然,dict(key=value) 方式不适用于非字符串键,因此这两种方式都有各自的用途,根据需求选择最合适的方式即可。
2. 使用 ** 合并字典
dict1: dict = dict(name='Jack Zhang', age=23)
dict2: dict = dict(city='San Francisco', major='Software Engineering')
com_dict: dict = {**test_dict, **test_dict2}
print(f'com_dict: {com_dict}')
# com_dict: {'name': 'Jack Zhang', 'age': 23, 'city': 'San Francisco'}
字典前面的 ** 符号用于将键值对解包到目标字典中。
3. 使用 ** 将字典作为参数传递
def personal_info(name: str, age: int, city: str) -> None:
print(f'Name: {name}, Age: {age}, City: {city}')
personal_info(name='Jack Zhang', age=23, city='San Francisco')
# Name: Jack Zhang, Age: 23, City: San Francisco
当然,我们也可以动态地将包含键 name, age 和 city 的字典传递给函数:
personal_info(**test_dict)
# Name: Jack Zhang, Age: 23, City: San Francisco
字典前面的 ** 可以将字典的键值解包到函数 personal_info 中。如果我们想要动态地将关键字参数传递到函数中,这种方式很有用。
4. 字典推导式
假设我们想要创建字典:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
有两种方式:
- ① 常规方式——循环实现:
num_pow: dict = {}
for num in range(1, 6):
num_pow[num] = num ** 2
print(f'num_pow: {num_pow}')
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
- ② 字典推导式实现:
num_pow2: dict = {num: num ** 2 for num in range(1, 6)}
print(f'num_pow2: {num_pow2}')
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
虽然两种方式都是正确且合法的方式,但请注意,字典推导式更加优雅、Pythonic 且可读性更强。
5. get(key, default_value) 获取字典值
通常情况下,当我们访问一个不存在的键时,会得到 KeyError:
test_dict: dict = dict(name='Jack Zhang', age=23, city='San Francisco')
print(f"zipcode: {test_dict['zipcode']}")
# KeyError: 'zipcode'
如果我们不希望出现 KeyError,那么可以使用 get() 方法,如果键不存在,该方法会返回 None:
print(f"zipcode: {test_dict.get('zipcode')}") # None
这个时候,我们就不会得到 KeyError,而是 None。此外,我们还可以设置默认值(如果键不存在):
print(f"zipcode: {test_dict.get('zipcode', '110110')}")
# zipcode: 110110
6. 根据元组列表创建字典
lst_of_tuple: list[tuple[str, str]] = [('Jack Zhang', 'Male'), ('John', 'Male'), ('Elina', 'Female')]
people_dict: dict = dict(lst_of_tuple)
print(f'Personal informaiton: {people_dict}')
# Personal informaiton: {'Jack Zhang': 'Male', 'John': 'Male', 'Elina': 'Female'}
在实际项目中,如果需要通过上下文的元组列表创建字典,这种方式就非常有用。
7. values() 和 items() 方法
一般情况下,当我们遍历字典本身时,我们得到的是字典的所有键:
for name in people_dict:
print(f'name: {name}')
# name: Jack Zhang
# name: John
# name: Elina
这等价于 .keys() 方法:
for name in people_dict.keys():
print(f'name: {name}')
# name: Jack Zhang
# name: John
# name: Elina
如果我们使用 .values() 方法,我们将生成字典的所有值:
for gender in people_dict.values():
print(f'gender: {gender}')
# gender: Male
# gender: Male
# gender: Female
然而,如果我们想要同时获取字典的键值对,则可以使用 .items() 方法:
for name, gender in people_dict.items():
print(f'name: {name}; gender: {gender}')
# name: Jack Zhang; gender: Male
# name: John; gender: Male
# name: Elina; gender: Female
8. setdefault() 方法
前面我们提到使用 get() 方法访问不存在的字典键时,不会得到 KeyError。其实,还有另外一种方法 setdefault() 可以达到相同的目的。与前者的区别在于,setdefault() 方法还可以动态修改字典,即当字典键不存在时,会向字典中增加新的键值对。
print(f'zipcode: {test_dict.get("zipcode", "110110")}')
print(test_dict)
print(f'zipcode: {test_dict.setdefault("zipcode", "110110")}')
print(test_dict)
使用 setdefault() 方法,我们可以轻易实现字符计数:
info: str = 'Python is a very powerful programming language!'
char_count: dict = dict()
for char in info:
char_count[char] = char_count.setdefault(char, 0) + 1
print(char_count)
# {'P': 1, 'y': 2, 't': 1, 'h': 1, 'o': 3, 'n': 3, ' ': 6, 'i': 2, 's': 1, 'a': 4, 'v': 1, 'e': 3, 'r': 4, 'p': 2, 'w': 1, 'f': 1, 'u': 2, 'l': 2, 'g': 4, 'm': 2, '!': 1}
9. 可以作为字典键以及不能作为键的数据类型
通常:
- 不可变数据类型可以作为字典键,比如:int, str, tuple, bool。
- 可变数据类型则不可以作为字典键,比如:list, dict。
结论
今天的分享就到这啦!感谢你的阅读,希望本文对你能有所帮助!