九个令人相见恨晚的Python字典技巧,让你写出更优雅、更Pythonic的代码!

开发 前端
今天笔者将向大家分享9个令人相见恨晚的Python字典技巧,让你更优雅高效地处理字典,写出更加Pythonic的代码。

今天笔者将向大家分享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。

结论

今天的分享就到这啦!感谢你的阅读,希望本文对你能有所帮助!

责任编辑:华轩 来源: 数据派探险家
相关推荐

2021-04-14 09:22:18

Python技巧交换变量值

2020-05-07 09:02:55

代码Python开发

2024-08-22 08:57:32

Python技巧参数

2017-06-01 09:34:55

R语言包sqldf

2021-09-28 14:40:03

Python内置库itertools

2024-01-29 00:51:39

前端开发利器

2024-09-05 16:02:52

Python数据类型字符串

2015-10-27 10:12:21

r语言命令相见恨晚

2018-01-25 14:53:20

iPhone技巧删除照片

2021-04-20 10:47:59

手机APP科技

2019-08-09 14:13:22

Python知乎程序员

2016-12-09 12:50:36

Android

2021-08-20 15:43:54

iPhone手机iOS

2020-05-06 09:18:56

Pandas函数大数据技术

2018-02-07 14:54:17

Riverbed应用性能管理数字体验

2021-08-19 15:02:32

科技软件电脑

2020-04-01 14:16:05

Pandastips数据分析

2020-11-23 21:23:34

办公

2019-12-02 10:16:45

Linux 开源操作系统

2019-08-29 09:10:11

Linux命令编程语言
点赞
收藏

51CTO技术栈公众号