PythonCookbook读书笔记

Posted 君以沫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PythonCookbook读书笔记相关的知识,希望对你有一定的参考价值。

第一章 数据结构和算法

 

1.1 将序列分解为单独的变量

适用于元组、列表、字符串等。只要是可迭代的对象,都可以执行分解操作。唯一的要求是变量的总数和结构要与序列相同。

 

1.2 从任意长度的可迭代对象中分解元素

“*表达式”

以下代码中使用的“*args”,如果去掉*,是会报错的。

records = [(foo,1,2),(bar,hello),(foo,3,4)]
for tag,*args in records:
    print(tag,*args)

拆分操作,和split结合使用,会实现非常好用的功能:

line = nobody:*:-2:-2:Unprivileged User:/Var/empty:/usr/bin/false
uname,*fields,homedir,sh = line.split(:)

 

1.3 保留最后N个元素

下边一段代码还不是特别理解,对生成器比较生疏。

from collections import deque

def search(lines,pattern,history):
    previous_lines = deque(maxlen=history)
    for line in lines:
        if pattern in line:
            yield line,previous_lines
        previous_lines.append(line)
        
if __name__ == __main__:
    with open(somefile.txt) as f:
        for line,prevlines in search(f,Python,5):
            for pline in prevlines:
                print(pline,end=‘‘)
            print(line,end=‘‘)
            print(-*20)

deque(maxlen=N)创建一个固定长度的队列,有新元素添加时,会自动删除最老的记录。

不指定长度的时候,创建一个无界限的队列:

from collections import deque
q = deque()
q.append(1)
q.append(2)
q.append(3)
print(q)

q.append(4)#右边添加元素
q.appendleft(0)#左边添加元素
print(q)
q.pop()#删除最右边元素
print(q)
q.popleft()#删除左边元素
print(q)

 

1.4 找到最大或最小的N个元素

 heapq模块中的nlargest和nsmallest函数:

import heapq
nums = [1,8,2,23,7,-4,16,23,42,37,2]
print(heapq.nlargest(3,nums))
print(heapq.nsmallest(3,nums))

提供一个参数key,使其工作在更复杂的结构上:

portfolio = [{name:IBM,shares:100,price:91.1},
             {name:AAPL,shares:50,price:543.22},
             {name:FB,shares:200,price:21.09},
             {name:HPQ,shares:35,price:31.75},
             {name:YHOO,shares:45,price:16.35},
             {name:ACME,shares:75,price:115.65}]
cheap = heapq.nsmallest(3,portfolio,key=lambda s: s[price])
print(cheap)
expensive = heapq.nlargest(3,portfolio,key=lambda s: s[price])
print(expensive)

如果正在寻找最大或者最小的N个元素,且同集合中元素的总数目相比,N很小,那么可以使用以下函数(性能更好):为什么?

nums = [1,8,2,23,7,-4,16,23,42,37,2]
heap = list(nums)

#找到第3小的元素
heapq.heappop(heap)
heapq.heappop(heap)
heapq.heappop(heap)

当所要寻找的元素数量相对较小时,nlargest和nsmallest函数才是最适用的。如果只是简单寻找最大和最小值,那么max和min函数会更快。如果N和集合本身大小差不多,通常更快的方法是先对集合排序,然后进行切片操作( sorted(items)[:N] 和sorted(items)[-N:] )。

 

1.5 实现优先级队列(暂时搁置)

 

1.6 在字典中将键映射到多个值上

一键多值字典,可以使用collections模块中的defaultdict类:

 

from collections import defaultdict

d = defaultdict(list)
d[a].append(1)
d[a].append(2)
d[b].append(3)
print(d)

d = defaultdict(set)
d[a].add(1)
d[a].add(2)
d[b].add(3)
print(d)

 

使用列表还是集合,取决于实际需要,注重顺序,则使用列表;希望去除重复值,则使用集合。

以上方法会自动创建字典表项以待稍后访问,也可以在普通字典上使用setdefault方法:

d = {}
d.setdefault(a,[]).append(1)
d.setdefault(a,[]).append(2)
d.setdefault(b,[]).append(3)
print(d)

 

1.7 让字典保持有序

 

以上是关于PythonCookbook读书笔记的主要内容,如果未能解决你的问题,请参考以下文章

Java网络编程(读书笔记)

《代码大全》读书笔记

《代码阅读》读书笔记

《梦断代码》读书笔记1

[读书笔记-代码大全]前言

第二周读书笔记《构建之法》