《Python Cookbook 3rd》第一章的20个答案

A1:任何序列 (或可迭代对象) 可通过一个简单赋值语句拆分并赋值给多个变量。唯一前提是变量数量必须与序列元素长度一致。其实,该拆分赋值法可用于任一可迭代对象上,而不仅仅是列表或元组,还包括字符串,文件对象,迭代器和生成器。

p = (4, 5)
x, y = p
print(x,y)#4 5

data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
name, shares, price, date = data
print(name,date) #ACME (2012, 12, 21)

s = 'Hello'
a, b, c, d, e = s
print(a, b, c, d, e) #H e l l o

A2:星号表达式。可用于字符串分割、数组等序列结构。

items = [1, 10, 7, 4, 5, 9]
head, *tail = items
print(head)#1
print(tail)#[10, 7, 4, 5, 9]

A3:保留有限历史记录正是collections.deque大显身手的时候。

from collections import deque
q = deque(maxlen=3)
q.append(1)
q.append(2)
q.append(3)
print(q) #deque([1, 2, 3], maxlen=3)
q.append(4)
print(q) #deque([2, 3, 4], maxlen=3)
q.append(5)
print(q) #deque([3, 4, 5], maxlen=3)

A4:使用heapq 模块的nlargest()和nsmallest()这两个函数。

当要查找的元素个数相对比较小的时候,函数nlargest()和nsmallest()是很合适的。

如果你仅仅想查找唯一的最小或最大(N=1)的元素的话,那么使用 min()和max()函数会更快些。

如果N的大小和集合大小接近的时候,通常先排序这个集合然后再使用切片操作会更快点(sorted(items)[:N] 或者是 sorted(items)[-N:])。

需要在正确场合使用函数 nlargest()和nsmallest()才能发挥它们的优势 (如果N快接近集合大小了,那么使用排序操作会更好些)。

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

A6:你需要将这多个值放到另外的容器中,比如列表或者集合里面。

collections 模块中的 defaultdict 可以用来构造这样的字典。

defaultdict 的一个特征是它会自动初始化每个 key 刚开始对应的值,所以你只需要关注添加元素操作了。

from collections import defaultdict

d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)
print(d) #defaultdict(, {'a': [1, 2, 1, 2], 'b': [4]})
d = defaultdict(set)
d['a'].add(1)
d['a'].add(2)
d['a'].add(1)
d['a'].add(2)
d['b'].add(4)
print(d) #defaultdict(, {'a': {1, 2}, 'b': {4}})
d = {}
for key, value in pairs:
	if key not in d:
		d[key] = []
		d[key].append(value)

#以下代码效果一样
d = defaultdict(list)
for key, value in pairs:
	d[key].append(value)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值