python+cookbook

python+cookbook

2026-10-20

深入理解Python语言机制和现代编程风格,主要内容集中于在标准库,框架和应用程序中广泛使用的高级技术

1 数据结构和算法


1.1 解压可迭代对象赋值给多个变量

问题 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个ValueError。那么 怎样才能从这个可迭代对象中解压出N个元素出来?

答案 使用星号表达式,其可以用来指代任意位置和任意数量的元素(包括0),只要它们是连续的,其储存形式为列表,可以搭配字符串的分割符号
这里还包含一个如何储存多个变量的值的问题,常用的方法是通过列表(不可修改),元组(可修改)以及字典,但是字典与元组和列表不同,是按名(KEY)解包的,所以赋值给其他变量相对麻烦一点,有很多其他办法可以实现比如Python中的Dataclass装饰器,其有1个值可以设计frozen=True(不可变,默认False,可变),slots=True(减少性能开销,默认是False)

1.2 保留最后N个元素

问题 在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录?

解决方案 

1.2 查找最大或最小的 N 个元素

问题 怎样从一个集合中获得最大或者最小的N个元素列表?

解决方案 如果你想在一个集合中查找最小或最大的N个元素,并且N小于集合元素数量, 那么这些函数提供了很好的性能。因为在底层实现里面,首先会先将集合数据进行堆排 序后放入一个列表中

heapify的源码如下,它是一个简单的调度器。_siftup 负责将某个节点“修复”到堆序中。它的策略很巧妙:先不比较,直接沿着“较小孩子”的路径一路走到叶子,把沿途的孩子都往上提;然后把最初的那个元素放到叶子空位上,最后调用 _siftdown,让这个元素从叶子位置向上“浮”到正确的高度。

 

1.3 实现一个优先级队列

问题 怎样实现一个按优先级排序的队列?并且在这个队列上面每次pop操作总是返回 优先级最高的那个元素

解决方案

1.4 字典中的键映射多个值

问题 怎样实现一个键对应多个值的字典(也叫multidict)?

 

1.5 字典排序

问题 你想创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序。

解决方案 为了能控制一个字典中元素的顺序,你可以使用 collections 模块中的 OrderedDict 类。在迭代操作的时候它会保持元素被插入时的顺序。OrderedDict 内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的 元素插入进来的时候,它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会 改变键的顺序。 需要注意的是,一个OrderedDict 的大小是一个普通字典的两倍,因为它内部维 护着另外一个链表。所以如果你要构建一个需要大量OrderedDict 实例的数据结构的 时候(比如读取100,000 行 CSV 数据到一个 OrderedDict 列表中去),那么你就得仔 细权衡一下是否使用OrderedDict 带来的好处要大过额外内存消耗的影响。

 

1.6 字典的运算

 

评论

暂无评论,快来抢沙发!

20 - 4 = ?
输入计算结果
分享这篇文章