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 字典的运算