文章目录
前言
这是python bookcook书籍的学习总结笔记
一、 数据结构和算法
1.获取可迭代对象部分元素
任何序列可通过赋值分解变量,用 * 可以分解多余的值,_表示丢弃值元素,()用来获取可迭代对象内层元素
示例:
list1=[1,2,3,[4,5],6]
start,*_=list1#start=1,*_为2,3,[4,5],6
start1,*_,[*_,l2],end=list1#l2为5
用处讨论
获得可迭代对象中所需要的一部分,它也可以与某些特定的字符串处理等生成序列的操作相结合
例
lines='www.baidu.com'
h,n,e=lines.split('.')
#www baidu com
2. 保存最后N个元素常利用depue队列特性:先进先出
import collections
q=collections.deque(maxlen=3)
q.append(1)
q.append(2)
q.append(3)#deque([1, 2, 3], maxlen=3)
q.append(4)#deque([2, 3, 4], maxlen=3)
补充:depue可以在两端执行添加和弹出操作,appendleft、popleft
3. 找到最大或最小的N个元素
利用heapq模块中的nlargest(n, iterable, key=None)和nsmallest(n, iterable, key=None)函数
from heapq import nlargest,nsmallest
store=[
{
'name':'apple','price':123},
{
'name': 'AVI', 'price': 1234},
{
'name': 'Cos', 'price': 1233},
{
'name': 'apples', 'price': 1213},
]
cheap=nsmallest(2,store,key=lambda s:s['price'])#[{'name': 'apple', 'price': 123}, {'name': 'apples', 'price': 1213}]
补充:N=1不如选min\max
4. 创建一键多值的字典
利用collections模块的defaultdict(type)
from collections import defaultdict
d=defaultdict(list)#选择容器类型为列表,为键添加值时,可以调用对应的方法
d['key1'].append('values1')
d['key1'].append('values2')#defaultdict(<class 'list'>, {'key1': ['values1', 'values2']})
print(d)
5. 让字典保持有序
问题描述:当我们学习字典时,就明白字典的key是无序的。但当我们对字典做迭代或序列化操作时,希望能控制其中元素的顺序。
利用collections模块中的OrderdDict类
import json
from collections import OrderedDict
d=OrderedDict()
d['key1']='v1'
d['key2']='v2'#OrderedDict([('key1', 'v1'), ('key2', 'v2')])
d=json.dumps(d)#{"key1": "v1", "key2": "v2", "key3": "v3", "key4": "v4"}
讨论:OrderdDict的大小是普通相同字典的两倍多,需要认真考虑OrderdDict带来的好处是否真的能替补它的缺点
补充:默认情况下Python的字典输出顺序是按照键的创建顺序。字典的无序是指,不能人为重新排序。比如说你按键值1,2,3,4的顺序创建的字典,只能由解析器按创建顺序,还是1,2,3,4的输出。你无法控制它按照4,3,2,1的顺序输出,你也无法做到1,3,2,4的顺序。而且这个输出顺序是也不是能真正按照创建顺序可以控的。这里面有两个影响因素:(1)键值的哈希碰撞,hash(key1) == hash(key2)时,向字典里连续添加的这个两个键的顺序是不可以控制的,也是无法做到连续的,后来的键会按算法调整到其它位置。(2)字典空间扩容,当键的数量超过字典默认开的空间时,字典会做空间扩容,扩容后的键顺和创建顺序就会发生变化,不受人为控制。
6. 对字典的值进行计算
问题描述:我们经常需要在字段上进行如最小值、排序等计算操作
解决:利用zip将字典与数据进行反转,在进行其他计算操作。
from heapq import n