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)