关于python当中字典值排序的问题

2025-02-28 19:44:25
推荐回答(1个)
回答1:

#!/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'))