平时工作时间越长,以前的基础知识忘得越多,只能偶尔翻一翻一些别人写的一些逻辑比较清晰的,自己记录下来回顾一下。
collections.deque可以生成固定大小,或不限大小的队列。你可以在队列的两端执行添加和弹出元素的操作。在队列两端插入或删除元素时间复杂度都是 O(1)
,而在列表的开头插入或删除元素的时间复杂度为 O(N)
from collections import deque
>>> q = deque(maxlen=2)
>>> q.append(1)
>>> q.append(2)
>>> q
deque([1, 2], maxlen=2)
>>> q.append(3)
>>> q
deque([2, 3], maxlen=2)
>>> q = deque()
>>> q.append(1)
>>> q.append(2)
>>> q
deque([1, 2])
>>> q.appendleft(3)
>>> q
deque([3, 1, 2])
>>> q.pop()
>>> q
deque([3, 1])
查找最大和最小的N个元素
heapq模块有两个函数:nlargest()
和 nsmallest()
可以解决这个问题。它们的返回值是一个列表。支持关键字参数。
import heapq
nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
heapq.nlargest(3, nums) # [42, 37, 23]
heapq.nsmallest(3, nums) # [-4, 1, 2]
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
]
cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
字典中一个键映射多个值
可以使用collections中的defaultdict来实现,defalultdict接受list或者set为参数
from collections import defaultdictd = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)
>>> d
defaultdict(<type 'list'>, {'a': [1, 2], b: [4]})
字典排序
使用 collections
模块中的 OrderedDict
类,会保持元素的插入顺序。可以控制json编码后的程序
d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
>>> import json
>>> json.dumps(d)
'{"foo": 1, "bar": 2, "spam": 3, "grok": 4}'
字典的运算
d = {'a':1},d.keys()、d.values(), d.items()在python 2中返回的是列表。在python3中,d.items()在返回的是一个个包含(键,值)对的元素视图对象,支持集合操作,d.keys()返回一个展现键集合的键视图对象,同样支持集合操作,d.values()返回值得视图对象,但是不支持集合操作。
如在python3中
# Find keys in common
a.keys() & b.keys() # { 'x', 'y' }
# Find keys in a that are not in b
a.keys() - b.keys() # { 'z' }
# Find (key,value) pairs in common
a.items() & b.items() # { ('y', 2) }