python Cookbook

1.5 heapq模块实现一个优先级队列

#实现优先级队列
import heapq
class PriorityQueue:

    def __init__(self):
        self._queue=[]
        self._index=0

    def push(self,item,priority):
        heapq.heappush(self._queue,(-priority,self._index,item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]

    def __get__(self):#get(),set()
        return self._queue

class Item:
    def __init__(self,name):
        self.name=name
    def __repr__(self):
        return 'Item({!r})'.format(self.name)


q=PriorityQueue()
q.push(Item('foo'),1)
q.push(Item('bar'),5)
q.push(Item('spam'),4)
q.push(Item('grop'),1)

q.pop()#bar
q.pop()#spam
q.pop()#foo
print(q.__get__())

 1.6 一键多值字典 1.7有序字典

#字典中将键映射到多个值上,字典是一种关联容器
from  collections import defaultdict

d=defaultdict(list)#列表,有序
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)
#print(d)
d=defaultdict(set)#集合,无序
d['a'].add(1)
d['a'].add(1)
d['b'].add(4)
#print(d)

# d=defaultdict(list)#有问题
# pairs={'a':1,
#        'b':2}
# for key,value in pairs:
#     d[key].append(value)
#print(d)

#1.7让字典保持有序OrderedDict
from collections import OrderedDict
import json
d= OrderedDict()
d['foo']=1
d['bar']=2
d['spam']=3
d['grok']=4
for key in d:
    print(key,d[key])
json.dumps(d)
print(d)

1.8字典的计算

#与字典有关的计算问题
#zip()将键和值反转
price={
    'ACME':45.23,
    'AAPL':612.78,
    'IBM':205.55,
    'HPQ':37.20,
    'FB':10.75
}
min_price=min(zip(price.values(),price.keys()))
#print(min_price)
max_price=max(zip(price.values(),price.keys()))
#print(max_price)
#数据排序
prices_sorted=sorted(zip(price.values(),price.keys()))
#print(prices_sorted)

#1.9在两个字典中寻找相同点
a={
    'x':1,
    'y':2,
    'z':3
}
b={
    'w':10,
    'x':11,
    'y':2
}
print(a.keys()&b.keys())
print(a.keys()-b.keys())
print(a.items()&b.items())#支持集合操作,返回键值对对象
print(a.values()&b.values())#错误,注意不支持values方法集合操作

 

posted on 2019-05-16 20:06  yaqiong1112  阅读(212)  评论(0编辑  收藏  举报