#?coding:?utf-8
#
#?author:?Tim?Wang
#?date:?Nov.,?2014
#?filename:?baidu/qa3.py
"""以下代碼僅提供擴展參考的方法,在2.7版本下可運行。"""
import?re
def?parser(dataserial,?patt,?keyname,?*evalattrs):
"""對給定的dataserial數據序列,用patt進行正則解析
對指定的evalattrs進行值轉換,
以其中的keyname為字典鍵值,
"""
collector?=?{}
for?matched?in?filter(None,?map(patt.match,?dataserial)):
data?=?matched.groupdict()
for?attr?in?evalattrs:
data[attr]?=?eval(data[attr])
collector[data.get(keyname)]?=?data
return?collector
def?iterdictsort(dictdatas,?sortattr):
for?v?in?sorted(dictdatas.values(),
key=lambda?v:?v.get(sortattr)):
yield?v
context?=?u"""
廣州2014-11-22蘋果996
深圳2014-11-23香蕉1075
杭州2014-11-24番茄543
北京2014-11-25橘子824
"""
patt?=?re.compile(r"""^
(?P<locale>\S+) \s+ (?P<date>\S+) \s+ (?P<product>\S+) \s+ (?P<qty>\d+) \s+ (?P<amount>\d+) \s*$""",?re.I|re.U|re.X)fmt?=?u"{locale}?{date}?{qty:4}?{amount:8}"
datas?=?parser(context.splitlines(),?patt,?"locale",?"qty",?"amount")
print?"="*32
print?"\n".join(fmt.format(**data)
for?data?in?iterdictsort(datas,?'qty'))
print?"="*32
print?"\n".join(fmt.format(**data)
for?data?in?iterdictsort(datas,?'amount'))