2

これは重複している可能性があります。たとえば、辞書のリストを持っているのと同じタイプの質問が見つかりませんでした

mylist=[
    {'month':'MAR2011','amount':90},
    {'month':'MAR2013','amount':190},
    {'month':'JUN2011','amount':290},
    {'month':'AUG2011','amount':930},
    {'month':'DEC2011','amount':30},
    {'month':'NOV2010','amount':40},
    {'month':'FEB 2013','amount':760},
    {'month':'SEP 2012','amount':330},
    {'month':'APR2013','amount':50},
    {'month':'NOV 2011','amount':450},
    {'month':'OCT 2012','amount':450},
]

私はこのような出力を取得したい:

[
{'month':'FEB 2013','amount':760},
{'month':'MAR2011','amount':90},
{'month':'MAR2013','amount':190},
{'month':'APR 2013','amount':50},
{'month':'JUN2011','amount':290},
{'month':'AUG2011','amount':930},
{'month':'SEP 2012','amount':330},
{'month':'OCT 2012','amount':450},
{'month':'NOV2010','amount':40},
{'month':'NOV 2011','amount':450},
{'month':'DEC2011','amount':30},
]

年は考えたくない。月ごとに並べ替えます。

前もって感謝します

4

2 に答える 2

8

月を序数にマッピングする辞書を作成します。

from calendar import month_abbr

month_to_index = {month.upper(): i for i, month in enumerate(month_abbr[1:])}

それを使用して並べ替えます。

sorted(mylist, key=lambda d: month_to_index[d['month'][:3]])

デモ:

>>> from calendar import month_abbr
>>> month_to_index = {month.upper(): i for i, month in enumerate(month_abbr[1:])}
>>> import pprint
>>> pprint.pprint(sorted(mylist, key=lambda d: month_to_index[d['month'][:3]]))
[{'amount': 760, 'month': 'FEB 2013'},
 {'amount': 90, 'month': 'MAR2011'},
 {'amount': 190, 'month': 'MAR2013'},
 {'amount': 50, 'month': 'APR2013'},
 {'amount': 290, 'month': 'JUN2011'},
 {'amount': 930, 'month': 'AUG2011'},
 {'amount': 330, 'month': 'SEP 2012'},
 {'amount': 450, 'month': 'OCT 2012'},
 {'amount': 40, 'month': 'NOV2010'},
 {'amount': 450, 'month': 'NOV 2011'},
 {'amount': 30, 'month': 'DEC2011'}]

月を最初に、年を 2 番目に並べ替えるには、キー関数からタプルを返します。

sorted(mylist, key=lambda d: (month_to_index[d['month'][:3]], d['month'][-4:]))

デモ:

>>> pprint.pprint(sorted(mylist, key=lambda d: (month_to_index[d['month'][:3]], d['month'][-4:])))
[{'amount': 760, 'month': 'FEB 2013'},
 {'amount': 90, 'month': 'MAR2011'},
 {'amount': 190, 'month': 'MAR2013'},
 {'amount': 50, 'month': 'APR2013'},
 {'amount': 290, 'month': 'JUN2011'},
 {'amount': 930, 'month': 'AUG2011'},
 {'amount': 330, 'month': 'SEP 2012'},
 {'amount': 450, 'month': 'OCT 2012'},
 {'amount': 40, 'month': 'NOV2010'},
 {'amount': 450, 'month': 'NOV 2011'},
 {'amount': 30, 'month': 'DEC2011'}]

この特定のケースでは、月ごとのデータが既に並べ替えられているため、違いはありません。

于 2013-07-07T18:06:00.907 に答える
1

最初に、月を数値にマップするマッピング ディクショナリを作成します。

>>> import re
>>> import pprint
>>> dic = {'JAN':1,'FEB':2,'MAR':3,'APR':4,'MAY':5,'JUN':6,'JULY':7,'AUG':8,'SEP':9,'OCT':10,'NOV':11,'DEC':12}
def func(x):
    m = re.search(r'[A-Z]+',x['month'])
    return dic[m.group(0)]
... 
>>> pprint.pprint(sorted(mylist, key = func))
[{'amount': 760, 'month': 'FEB 2013'},
 {'amount': 90, 'month': 'MAR2011'},
 {'amount': 190, 'month': 'MAR2013'},
 {'amount': 50, 'month': 'APR2013'},
 {'amount': 290, 'month': 'JUN2011'},
 {'amount': 930, 'month': 'AUG2011'},
 {'amount': 330, 'month': 'SEP 2012'},
 {'amount': 450, 'month': 'OCT 2012'},
 {'amount': 40, 'month': 'NOV2010'},
 {'amount': 450, 'month': 'NOV 2011'},
 {'amount': 30, 'month': 'DEC2011'}]
于 2013-07-07T18:07:06.397 に答える