#!/usr/bin/env python
# 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 苹果 9 96
深圳 2014-11-23 香蕉 10 75
杭州 2014-11-24 番茄 5 43
北京 2014-11-25 橘子 8 24
"""
patt = re.compile(r"""^
(?P\S+)
\s+
(?P\S+)
\s+
(?P\S+)
\s+
(?P\d+)
\s+
(?P\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'))