PYTHON基础技能 – Python字典与集合的15个高级操作与优化建议

释放双眼,带上耳机,听听看~!

今天我们将一起探索Python中最强大且高效的两个数据结构——字典和集合,它们在数据处理中扮演着至关重要的角色。通过这15个高级操作和优化技巧,你们将学会如何像专家一样驾驭它们,让代码更加简洁高效。

1. 字典推导式(Dictionary Comprehensions)

字典推导式是创建字典的快捷方式。比如,将一个列表的元素转换为其平方作为值:


1
squares&nbsp;=&nbsp;{num:&nbsp;num**2&nbsp;for&nbsp;num&nbsp;in&nbsp;range(1,&nbsp;6)}<br>print(squares)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{1:&nbsp;1,&nbsp;2:&nbsp;4,&nbsp;3:&nbsp;9,&nbsp;4:&nbsp;16,&nbsp;5:&nbsp;25}</em>

2. 合并字典(Using
1
update()

合并两个字典时,

1
update()

方法非常有用,它会将一个字典的键值对添加到另一个字典中,如果有重复的键,则后者的值会覆盖前者。


1
dict1&nbsp;=&nbsp;{'a':&nbsp;1,&nbsp;'b':&nbsp;2}<br>dict2&nbsp;=&nbsp;{'b':&nbsp;3,&nbsp;'c':&nbsp;4}<br>dict1.update(dict2)<br>print(dict1)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{'a':&nbsp;1,&nbsp;'b':&nbsp;3,&nbsp;'c':&nbsp;4}</em>

3. 集合的基本运算

集合支持并集(

1
|

)、交集(

1
&amp;

)、差集(

1
-

)和对称差集(

1
^

)等操作,非常适合用于数据的去重和比较。


1
set1&nbsp;=&nbsp;{1,&nbsp;2,&nbsp;3}<br>set2&nbsp;=&nbsp;{2,&nbsp;3,&nbsp;4}<br>print(set1&nbsp;|&nbsp;set2)&nbsp;&nbsp;<em>#&nbsp;并集:&nbsp;{1,&nbsp;2,&nbsp;3,&nbsp;4}</em><br>print(set1&nbsp;&amp;&nbsp;set2)&nbsp;&nbsp;<em>#&nbsp;交集:&nbsp;{2,&nbsp;3}</em>

4. 字典的get()方法

避免KeyError的好方法,当键不存在时,可以返回默认值。


1
my_dict&nbsp;=&nbsp;{'name':&nbsp;'Alice'}<br>print(my_dict.get('age',&nbsp;'Not&nbsp;Available'))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;Not&nbsp;Available</em>

5. 集合推导式

类似于字典推导,用于快速创建集合。


1
even_numbers&nbsp;=&nbsp;{num&nbsp;for&nbsp;num&nbsp;in&nbsp;range(1,&nbsp;11)&nbsp;if&nbsp;num&nbsp;%&nbsp;2&nbsp;==&nbsp;0}<br>print(even_numbers)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{2,&nbsp;4,&nbsp;6,&nbsp;8,&nbsp;10}</em>

6. 字典的items()遍历

遍历字典的键值对,非常适合用于同时处理键和值。


1
for&nbsp;key,&nbsp;value&nbsp;in&nbsp;squares.items():<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"{key}:&nbsp;{value}")

7. 集合的互斥性检查(isdisjoint())

判断两个集合是否有交集。


1
set1&nbsp;=&nbsp;{1,&nbsp;2,&nbsp;3}<br>set2&nbsp;=&nbsp;{4,&nbsp;5,&nbsp;6}<br>print(set1.isdisjoint(set2))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;True</em>

8. 字典的pop()方法

移除指定键的项,并返回其值,若键不存在,可设置默认返回值。


1
value&nbsp;=&nbsp;my_dict.pop('name',&nbsp;'Default')<br>print(value)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;Alice</em>

9. 集合的add()和remove()

动态地添加或移除元素。


1
set1.add(5)<br>set1.remove(3)<br>print(set1)&nbsp;&nbsp;<em>#&nbsp;假设初始为{1,&nbsp;2,&nbsp;3,&nbsp;4},&nbsp;输出将是{1,&nbsp;2,&nbsp;4,&nbsp;5}</em>

10. 字典的fromkeys()

快速生成一个字典,所有键都有相同的初始值。


1
keys&nbsp;=&nbsp;&#091;'a',&nbsp;'b',&nbsp;'c']<br>values&nbsp;=&nbsp;0<br>my_dict&nbsp;=&nbsp;dict.fromkeys(keys,&nbsp;values)<br>print(my_dict)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{'a':&nbsp;0,&nbsp;'b':&nbsp;0,&nbsp;'c':&nbsp;0}</em>

11. 集合的copy()

创建集合的浅复制,适用于不希望原集合改变的情况。


1
original_set&nbsp;=&nbsp;{1,&nbsp;2,&nbsp;3}<br>copied_set&nbsp;=&nbsp;original_set.copy()<br>copied_set.add(4)<br>print(original_set)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{1,&nbsp;2,&nbsp;3}</em>

12. 字典的defaultdict

避免KeyError,自动为不存在的键分配默认值类型。


1
from&nbsp;collections&nbsp;import&nbsp;defaultdict<br>d&nbsp;=&nbsp;defaultdict(int)&nbsp;&nbsp;<em>#&nbsp;默认值为0</em><br>print(d&#091;'new_key'])&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;0</em>

13. 集合的frozenset()

如果你需要一个不可变的集合,可以使用

1
frozenset

,这对于用作字典键或作为集合的元素非常有用。


1
frozen_set&nbsp;=&nbsp;frozenset(&#091;1,&nbsp;2,&nbsp;3])

14. 字典视图对象

1
keys()

,

1
values()

, 和

1
items()

返回的是视图对象,这意味着它们反映了字典的变化。


1
view&nbsp;=&nbsp;my_dict.keys()<br>my_dict&#091;'age']&nbsp;=&nbsp;25<br>print(view)&nbsp;&nbsp;<em>#&nbsp;输出将包含新添加的键'age'</em>

15. 优化建议:利用字典和集合的特性

  • 在需要快速查找和去重的场景下优先考虑使用字典和集合。
  • 对于频繁的成员资格测试(
    1
    in

    操作),集合比列表快得多。

  • 利用字典推导和集合推导减少代码量,提高可读性。

通过掌握这些高级操作和优化策略,你的Python编程能力将得到显著提升。

实战案例分析

16. 字典的合并与更新技巧

有时候,你可能需要合并多个字典,特别是当处理配置文件或参数传递时。Python 3.5及以上版本引入了一个新特性,使得这个过程更加优雅:


1
dict1&nbsp;=&nbsp;{'x':&nbsp;1,&nbsp;'y':&nbsp;2}<br>dict2&nbsp;=&nbsp;{'y':&nbsp;3,&nbsp;'z':&nbsp;4}<br>merged_dict&nbsp;=&nbsp;{**dict1,&nbsp;**dict2}&nbsp;&nbsp;<em>#&nbsp;Python&nbsp;3.5+&nbsp;的字典解构</em><br>print(merged_dict)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{'x':&nbsp;1,&nbsp;'y':&nbsp;3,&nbsp;'z':&nbsp;4}</em>

这里,

1
**

操作符允许我们“展开”字典,从而直接合并它们,遇到相同键时,后面的字典中的值会覆盖前面的。

17. 集合的高级运算实战

集合除了基本运算外,还可以用来解决复杂的逻辑问题,例如找出两个列表的唯一元素:


1
list1&nbsp;=&nbsp;&#091;1,&nbsp;2,&nbsp;3,&nbsp;4]<br>list2&nbsp;=&nbsp;&#091;3,&nbsp;4,&nbsp;5,&nbsp;6]<br>unique_elements&nbsp;=&nbsp;set(list1)&nbsp;^&nbsp;set(list2)&nbsp;&nbsp;<em>#&nbsp;对称差集</em><br>print(unique_elements)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{1,&nbsp;2,&nbsp;5,&nbsp;6}</em>

18. 字典映射函数值

如果你有一个字典,并想对每个值应用一个函数,可以结合字典推导式和函数调用:


1
prices&nbsp;=&nbsp;{'apple':&nbsp;1.0,&nbsp;'banana':&nbsp;2.0}<br>discounted_prices&nbsp;=&nbsp;{item:&nbsp;price&nbsp;*&nbsp;0.9&nbsp;for&nbsp;item,&nbsp;price&nbsp;in&nbsp;prices.items()}<br>print(discounted_prices)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{'apple':&nbsp;0.9,&nbsp;'banana':&nbsp;1.8}</em>

这里,我们对每个价格应用了90%的折扣。

19. 集合的交集用于过滤

假设你有两个列表,想要找出同时存在于两个列表中的元素,集合的交集功能就非常合适:


1
list_a&nbsp;=&nbsp;&#091;1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5]<br>list_b&nbsp;=&nbsp;&#091;4,&nbsp;5,&nbsp;6,&nbsp;7,&nbsp;8]<br>common_elements&nbsp;=&nbsp;set(list_a)&nbsp;&amp;&nbsp;set(list_b)<br>print(common_elements)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;{4,&nbsp;5}</em>

20. 字典的深拷贝与浅拷贝理解

对于复杂的嵌套字典,浅拷贝可能不足以满足需求,此时应使用

1
copy.deepcopy()


1
import&nbsp;copy<br>nested_dict&nbsp;=&nbsp;{'a':&nbsp;1,&nbsp;'b':&nbsp;{'c':&nbsp;2}}<br>shallow_copy&nbsp;=&nbsp;copy.copy(nested_dict)<br>deep_copy&nbsp;=&nbsp;copy.deepcopy(nested_dict)<br><br><em>#&nbsp;修改原字典的嵌套部分</em><br>nested_dict&#091;'b']&#091;'c']&nbsp;=&nbsp;3<br><br>print(shallow_copy&#091;'b']&#091;'c'])&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;3,因为是浅拷贝</em><br>print(deep_copy&#091;'b']&#091;'c'])&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;2,深拷贝不受影响</em>

通过这些实战案例,你不仅学会了字典与集合的高级操作,还了解了如何在具体场景中应用这些知识,提升了解决问题的能力。

给TA打赏
共{{data.count}}人
人已打赏
安全运维

安全运维之道:发现、解决问题的有效闭环

2024-4-14 20:59:36

安全运维

稳定性建设 – 架构优化的关键策略

2025-2-11 17:15:56

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索