當前位置:成語大全網 - 新華字典 - 關於python當中字典值排序的問題

關於python當中字典值排序的問題

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