deque 类可以被用在任何只需要一个简单队列数据结构的场合,如果
不设置最大队列大小(maxlen),那么就会得到一个无限大小队列,你可以在队列的两端执行添加和弹出元素的操作
Collections
中有不少挺实用的??椋热?code>deque
使用list存储数据时,按索引访问元素很快,只是插入和删除元素比较慢,deque就是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
deque
除了实现list的append()
和pop()
外,还支持appendleft()
和popleft()
,这样就可以非常高效地往头部添加或删除元素。
li = deque(li)
li.append('x')
li.appendleft('y')
print(li) # deque(['y', '1', 'a', 'b', 'c', 'x'])
下面为cookbook中的例子: 保存有限历史纪录
from collections import deque
def search(lines, pattern, history=5):
previous_lines = deque(maxlen=history) # 构建一个固定大小的队列. 当新的元素加入并且这个队列已满的时候,前面的元素就会被移除掉, 这个逻辑,嗯嗯,happy的使用。
for li in lines:
if pattern in li:
yield li, previous_lines
previous_lines.append(li)
if __name__ == '__main__':
with open(r'somefile.txt') as f:
for line, prevlines in search(f, 'Python', 5):
for pline in prevlines:
print(pline, end='')
print(line, end='')
print('-' * 20)
从一个集合中获取最大或者最小的N个元素的集合?
答: 使用heapq
??椋缦滤荆?/p>
import heapq
nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
print(heapq.nlargest(3,nums)) # [42, 37, 23]
print(heapq.nsmallest(2,nums))# [-4, 1]
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} ]
print(heapq.nlargest(3, portfolio, key=lambda x:x['price']))
#[{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'ACME', 'shares': 75, 'price': 115.65}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]
print(heapq.nsmallest(2, portfolio, key=lambda x:x['shares']))
#[{'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}]
其实取最大或者最小,有几种方法可以使用,按需?。?/p>
-
sorted(items)[:N]
orsorted(items)[-N:]
-
min()
ormax()
-
heapq.nlargest()
orheapq.nsmallest()
字典中的键映射多个值
l = [('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]
from collections import defaultdict
d = defaultdict(list)
for key,value in l:
d[key].append(value)
print(d)
输出:defaultdict(<class 'list'>, {'a': [2, 1, 3, 1], 'b': [3, 4, 3]})
字典排序
可以使用Collections中的OrderedDict类.
d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
for key in d:
print(key, d[key])
比如想精确控制编码后的字段的顺序,就可以先使用OrderDict来构建这样的数据
import json
print(json.dumps(d))
字典的运算
在字典中做一些操作,比如求最大值,最小值,排序等等
巧用zip()与lambda.
prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75}
min_price = min(zip(prices.values(),prices.keys()))
#min_price = list(zip(prices.values(),prices.keys()))
print(min_price)
# 排序
prices_sorted = sorted(zip(prices.values(), prices.keys()))
print(prices_sorted)
#在 min() 和 max() 函数中提供 key 函数参数来获取最小值或最大值对应的键的信息
print(min(prices, key=lambda k: prices[k])) # Returns 'FB'