如何按日期defaultdict(list)值排序?

时间:2013-05-21 16:47:36

标签: python python-2.7

defaultdict(<type 'list'>, {'003': [('Biology', 'A', '04/18/2013'), ('Irdu', 'A'
, '04/17/2013')], '002': [('Biology', 'A', '03/01/2013'), ('Math', 'C', '01/10/2
013'), ('Math', 'C', '03/10/2013')], '001': [('Biology', 'B', '05/01/2013'), ('L
iterature', 'B', '03/02/2013'), ('Math', 'A', '02/20/2013')]})

我想按日期对每个键进行排序,并获得以下输出

defaultdict(<type 'list'>, {'003': [('Irdu', 'A', '04/17/2013'), ('Biology', 'A', '04/18/2013')], '002': [('Math', 'C', '01/10/2013'), ('Biology', 'A', '03/01/2013'), ('Math', 'C', '03/10/2013')], '001': [('Math', 'A', '02/20/2013'), ('Literature', 'B', '03/02/2013'), ('Biology', 'B', '05/01/2013')]})

我尝试了以下但是没有任何想法?

accounts = defaultdict(list)
sortedData = sorted(accounts.iteritems(), key=operator.itemgetter(2))

3 个答案:

答案 0 :(得分:2)

我想你想要这样的东西:

key = itemgetter(2)
sortedData = {}
for k, v in accounts.items():
    v.sort(key=key)
    sortedData[k] = v

sortedData = {(k, list(sorted(v, key=key)) for k, v in accounts.items()}

答案 1 :(得分:1)

iteritems返回键/值对的迭代器。如果要使用它,则必须跳过键并对值进行排序。如果您想实际修改defaultdict本身,那么就地排序最好:

getter = operator.itemgetter(2)
for v in accounts.itervalues():
    v.sort(key=getter)

如果需要新的defaultdict,可以使用生成器表达式:

getter = operator.itemgetter(2)
sortedData = defaultdict(list,
    {k: sorted(v, key=getter) for k, v in accounts.iteritems()})

答案 2 :(得分:1)

这应该可以解决问题:

from collections import defaultdict
from datetime import datetime

d = defaultdict(list, {'003': [('Biology', 'A', '04/18/2013'), ('Irdu', 'A', '04/17/2013')], '002': [('Biology', 'A', '03/01/2013'), ('Math', 'C', '01/10/2013'), ('Math', 'C', '03/10/2013')], '001': [('Biology', 'B', '05/01/2013'), ('Literature', 'B', '03/02/2013'), ('Math', 'A', '02/20/2013')]})

def key(entry):
    _, _, date_string = entry
    date_entry = datetime.strptime(date_string, '%m/%d/%Y').date()
    return (date_entry.year, date_entry.month, date_entry.day)

{k: sorted(v, key=key) for k,v in d.iteritems()}
>>> {
'001': [('Math', 'A', '02/20/2013'),
    ('Literature', 'B', '03/02/2013'),
    ('Biology', 'B', '05/01/2013')],
'002': [('Math', 'C', '01/10/2013'),
    ('Biology', 'A', '03/01/2013'),
    ('Math', 'C', '03/10/2013')],
'003': [('Irdu', 'A', '04/17/2013'), ('Biology', 'A', '04/18/2013')]
}